【问题标题】:Add/Remove data members with template parameters?使用模板参数添加/删除数据成员?
【发布时间】:2012-08-20 12:29:19
【问题描述】:

考虑以下代码:

template<bool AddMembers> class MyClass
{
    public:
        void myFunction();
        template<class = typename std::enable_if<AddMembers>::type> void addedFunction();

    protected:
        double myVariable;
        /* SOMETHING */ addedVariable;
};

在此代码中,模板参数AddMembers 允许在类为true 时添加一个函数。为此,我们使用std::enable_if

我的问题是:数据成员变量是否同样可能(可能有技巧)? (这样MyClass&lt;false&gt; 将有 1 个数据成员(myVariable),MyClass&lt;true&gt; 将有 2 个数据成员(myVariableaddedVariable)?

【问题讨论】:

    标签: c++ templates c++11 metaprogramming enable-if


    【解决方案1】:

    可以使用条件基类:

    struct BaseWithVariable    { int addedVariable; };
    struct BaseWithoutVariable { };
    
    template <bool AddMembers> class MyClass
        : std::conditional<AddMembers, BaseWithVariable, BaseWithoutVariable>::type
    {
        // etc.
    };
    

    【讨论】:

      【解决方案2】:

      首先,您的代码不会为MyClass&lt;false&gt; 编译。 enable_if trait 对于 deduced 参数很有用,而不是类模板参数。

      其次,控制成员的方法如下:

      template <bool> struct Members { };
      
      template <> struct Members<true> { int x; };
      
      template <bool B> struct Foo : Members<B>
      {
          double y;
      };
      

      【讨论】:

      • +++++1 完美!带条件模板参数的mixin
      • 我发现这比接受的答案更好,谢谢!
      猜你喜欢
      • 2015-03-31
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多