15

是否可以在不使用虚拟空类型的情况下根据模板条件声明或不声明成员变量?

例子:

struct empty{};
struct real_type{};

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

2 回答 2

13

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

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
}
于 2013-05-21T15:01:08.190 回答
1

是否可以在不使用虚拟空类型的情况下根据模板条件声明或不声明成员变量?

我相信您也可以在没有推导的情况下进行专业化。 这在和下都测试正常。-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
};
于 2016-04-13T05:42:53.787 回答