模板中的可选变量声明

时间:2018-01-17 06:30:44

标签: c++ c++17

如果模板参数中的某些条件为真,我想在类模板中声明成员变量。我可以使用嵌套类作为容器,但在这种情况下不可能进行明确的特化。

我正在尝试这样的事情:

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。

1 个答案:

答案 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;分配器如果没有无状态则不占用空间。