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()'が見つかりません。 なぜですか?
あなたは、コードがこれ以上読めなくなりましたか? –
@NeilButterworth:応答してくれてありがとうが、役に立つコメントに固執してください - 私は単純なコードを作成しようと考えていたので、できるだけ読みやすく、どうすれば失敗しましたか?失敗した実際のコードはもっと複雑です。 – JVD
これは参考になりました。ここで助けが必要な場合は、より明確なコードを書く必要があることを伝えていました。あなたはくぼみや間隔などのことを聞いたことがありますか? –