【问题标题】:std::conditional - nested usagestd::conditional - 嵌套使用
【发布时间】:2017-06-17 22:22:04
【问题描述】:

拜托,最聪明的 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()'。 为什么 ?

【问题讨论】:

  • 你能不能让代码更不可读?
  • @NeilButterworth:感谢您的回复,但请坚持使用有用的 cmets - 我想我试图使代码尽可能简单,因此尽可能可读 - 我是怎么失败的?真正失败的代码要复杂得多。
  • 这是一个很有帮助的评论——它告诉你如果你在这里需要帮助,你需要编写更清晰的代码。我希望您听说过诸如缩进和间距之类的东西?

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


【解决方案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>::type,e
>::type T;

?

【讨论】:

  • 是的。这就是答案!谢谢!比第五次重读手册中的模板和 type_traits 章节要快得多....
【解决方案2】:

你忘记了另一个::types上的::type

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 2017-11-16
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2021-09-30
    • 2021-10-24
    • 1970-01-01
    相关资源
    最近更新 更多