2016-11-28 6 views
7

は、私はコンセプトを持っていると言う:短い形式の概念を使用している場合コンセプトから型を取り出す方法は?

template < typename Group > concept bool GGroup = 
    requires() { typename Group::Inner; }; 

は、どのように私はタイプInnerを取得することができますか?

void doSomething(const GGroup& group) 
{ 
    // an ugly alternative 
    using Inner = typename std::decay_t<decltype(group)>::Inner; 

    //// could be something like: 
    // using Inner = GGroup::Inner; 
    // or 
    // using Inner = underlyingtype(GGroup)::Inner; 
} 
+1

長いフォームを使用するとどうなるでしょう: 'template void doSomething(const Group&group){... Group :: Inner ...}'? – ach

+0

@AndreyChernyakhovskiyはい、ただし、要点は短い形式で行うことです。 – Vahagn

+4

あなたは自分の目的を打ち負かします。ショートフォームを使用することはできません(実際のタイプへの不要な参照を排除することがポイントです)。同時に、実際のタイプを参照してください。言語デザイナーにとって、 'GGroup :: Inner'のようなものはあいまいなのでオプションではありませんでした。 'doSomething(const GGroup&group1、const GGroup&group2)'があれば 'template void doSomething(const Group1&group1、const Group2&group2)'と同等です。どちらが 'GGroup'を参照するのでしょうか? – ach

答えて

3

コンセプトTSの短い形式の欠点は、概念化されたパラメータのタイプ名に名前を付けることだけではできないということです。あなたはそれを得るためにdecltypeを使用しなければなりません。

だから、トレードオフを持っている:あなたは、あなたの実際のコードでdecltype以上の犠牲に明示template宣言を避けることができますいずれか、または明示的なテンプレート宣言を犠牲にしてdecltypeを避けることができます。

関連する問題