std :: conditional - 嵌套用法

时间:2017-06-17 22:22:04

标签: c++ c++11 templates typetraits

请噢,最聪明的C ++ type_traits大师,有人可以解释原因 此代码失败并显示错误 - 我正在分析最新的C ++ - 17 起草标准并且无法理解为什么会失败(在Linux上使用gcc-5.4.0):

#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()函数 在'C'#define中低位3位的每个唯一组合上 (或枚举成员)。 我认为上面的内容是std :: conditional的意思。 请注意,即使'ab'的条件为真,也找不到'ab :: f()'。 为什么?

2 个答案:

答案 0 :(得分:0)

怎么样?
::type

答案 1 :(得分:0)

您忘记了其他std::conditional的{​​{1}}:

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;