模板中的可选变量声明

optional variable declaration in a template

本文关键字:变量 声明      更新时间:2023-10-16

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

我正在尝试这样的事情:

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。

是的,你也可以吃你的蛋糕。只需从正确的类型继承,并依赖于空的基础优化。

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>
{
};

标准库实现本身依赖于它来"存储"分配器,而不会占用空间(如果它们是无状态的(。