是否可以根据模板条件声明成员变量而不使用虚拟空类型?
示例:
struct empty{};
struct real_type{};
template<bool condition>
struct foo
{
typename std::conditional<condition, real_type, empty>::type _member;
};
答案 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
};