根据模板参数声明成员与否

时间:2013-05-21 14:58:15

标签: c++ templates c++11

是否可以根据模板条件声明成员变量而不使用虚拟空类型?

示例:

struct empty{};
struct real_type{};

template<bool condition>
struct foo
{
    typename std::conditional<condition, real_type, empty>::type _member;
};

2 个答案:

答案 0 :(得分:12)

您可以从具有专业化的模板派生:

struct real_type { };

template<bool c>
struct foo_base { };

template<>
struct foo_base<true>
{
    real_type _member;
};

template<bool condition>
struct foo : foo_base<condition>
{
};

作为一个小测试:

int main()
{
    foo<true> t;
    t._member.x = 42; // OK

    foo<false> f;
    f._member.x = 42; // ERROR! No _member exists
}

答案 1 :(得分:0)

  

是否可以根据模板条件声明成员变量而不使用虚拟空类型?

我相信你也可以specialize 而不用推导。这在-std=c++03-std=c++11下都经过了测试。

template<bool condition>
struct foo;

template<>
struct foo<true>
{
    real_type _member;
};

template<>
struct foo<false>
{
};

如果C ++委员会给了我们想要/需要的东西,那肯定会很好:

template<bool condition>
struct foo
{
#if (condition == true)
    real_type _member;
#endif
};