如果模板参数中的某些条件为真,我想在类模板中声明成员变量。我可以使用嵌套类作为容器,但在这种情况下不可能进行明确的特化。
我正在尝试这样的事情:
enum class VarPolice { Declare, DontDeclare };
template<VarPolice vp = VarPolice::Declare>
class MyClass
{
struct EmptyStruct {};
struct VarSaverStruct { int MyVar; };
using VarSaver = typename std::conditional<vp == VarPolice::Declare, VarSaverStruct, EmptyStruct>::type;
VarSaver saver;
}
因此,我可以将MyVar
用作saver.MyVar
有没有办法在不使用具有大小开销的EmptyStruct的情况下进行可选变量声明?
可以使用C ++ 17。
答案 0 :(得分:4)
是的,你可以吃蛋糕,也可以吃。只需继承正确的类型,并依赖空基优化。
enum class VarPolice { Declare, DontDeclare };
struct EmptyStruct {};
struct VarSaverStruct { int MyVar; };
template<VarPolice vp = VarPolice::Declare>
class MyClass : std::conditional_t<vp == VarPolice::Declare,
VarSaverStruct, EmptyStruct>
{
};
标准库实现依赖于它自己来存储&#34;分配器如果没有无状态则不占用空间。