2017-06-17 14 views
-4

C++ type_traits gurusはなぜこのコードがエラーで失敗するのかを説明することができますか? - 最新のC++ - 17 ドラフト標準を分析しています。 Linux上のgcc-5.4.0):std :: conditional - ネストされた使用

#include <type_traits> 

struct a 
{static 
void f(void){} 
}; 
struct b 
{static 
void f(void){} 
}; 
struct c 
{static 
void f(void){} 
}; 
struct abc 
{static 
void f(void){} 
}; 
struct ab 
{static 
void f(void){} 
}; 
struct ac 
{static 
void f(void){} 
}; 
struct bc 
{static 
void f(void){} 
}; 
struct d 
{static 
void f(void){} 
}; 
struct e 
{static 
void f(void){} 
}; 

#define C 3 

typedef 
std::conditional 
<(C<8), 
std::conditional 
<C==7, abc, 
std::conditional 
<C==6, bc, 
std::conditional 
<C==5, ac, 
std::conditional 
<C==4, c, 
std::conditional 
<C==3, ab, 
std::conditional 
<C==2, b, 
std::conditional 
<C==1, a, d>>>>>>>,e 
>::type T; 

void f(void) 
{ T::f(); 
} 

コードはコンパイルされません:

$ g++ -I. -std=gnu++17 -g -O2 -mtune=native -fPIC -pipe -pthread 
-D_REENTRANT -Wall -Wextra -Wno-unused -fno-pretty-templates -c /tmp/T.C 
-o /dev/null 
/tmp/T.C: In function 'void f()': 
/tmp/T.C:62:3: error: 'f' is not a member of 'T {aka 
std::conditional<false, abc, std::conditional<false, bc, 
std::conditional<false, ac, std::conditional<false, c, 
std::conditional<true, ab, std::conditional<false, b, 
std::conditional<false, a, d> > > > > > >}' 
{ T::f(); 
     ^

を私の目標は、低のすべてのユニークな組み合わせに を基づいて、異なるクラスのF()関数を呼び出すことがあります-order 3ビットin 'C'#は (またはenumメンバー)を定義します。 上記はstd :: conditionalが行うことを意図していると考えました。 注意: 'ab'の条件が真であっても、 'ab :: f()'が見つかりません。 なぜですか?

+9

あなたは、コードがこれ以上読めなくなりましたか? –

+0

@NeilButterworth:応答してくれてありがとうが、役に立つコメントに固執してください - 私は単純なコードを作成しようと考えていたので、できるだけ読みやすく、どうすれば失敗しましたか?失敗した実際のコードはもっと複雑です。 – JVD

+4

これは参考になりました。ここで助けが必要な場合は、より明確なコードを書く必要があることを伝えていました。あなたはくぼみや間隔などのことを聞いたことがありますか? –

答えて

0

typedef 
std::conditional 
<(C<8), 
std::conditional 
<C==7, abc, 
std::conditional 
<C==6, bc, 
std::conditional 
<C==5, ac, 
std::conditional 
<C==4, c, 
std::conditional 
<C==3, ab, 
std::conditional 
<C==2, b, 
std::conditional 
<C==1, a, d>::type>::type>::type>::type>::type>::type>::type,e 
>::type T; 

については何?あなたが他のstd::conditionalの上::typeを忘れてしまった

+0

はい。それは答えでした!ありがとう!マニュアルのテンプレートとtype_traitsの章の5回目の再読み込みに着手するよりもはるかに迅速です。 – JVD

0

typedef std::conditional<C<8, 
    std::conditional<C==7, abc, 
    std::conditional<C==6, bc, 
    std::conditional<C==5, ac, 
    std::conditional<C==4, c, 
    std::conditional<C==3, ab, 
    std::conditional<C==2, b, 
    std::conditional<C==1, a, d> 
    >::type 
    >::type 
    >::type 
    >::type 
    >::type 
    >::type,e 
>::type T; 
+0

AHA!それはそれかもしれない...今しようとする... – JVD

関連する問題