Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用模板参数添加/删除数据成员?_C++_Templates_C++11_Metaprogramming_Enable If - Fatal编程技术网

C++ 使用模板参数添加/删除数据成员?

C++ 使用模板参数添加/删除数据成员?,c++,templates,c++11,metaprogramming,enable-if,C++,Templates,C++11,Metaprogramming,Enable If,考虑以下代码: template<bool AddMembers> class MyClass { public: void myFunction(); template<class = typename std::enable_if<AddMembers>::type> void addedFunction(); protected: double myVariable; /*

考虑以下代码:

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

    protected:
        double myVariable;
        /* SOMETHING */ addedVariable;
};
模板类MyClass
{
公众:
void myFunction();
模板void addedFunction();
受保护的:
双变量;
/*可加变量的事物;
};
在这段代码中,模板参数
AddMembers
允许在类为
true
时向类添加函数。为此,我们使用
std::enable_if


我的问题是:对于数据成员变量,是否也有相同的可能(可能有一个技巧)?(以这样的方式,
MyClass
将有1个数据成员(
myVariable
)和
MyClass
将有2个数据成员(
myVariable
addedVariable
)?

可以使用条件基类:

struct BaseWithVariable    { int addedVariable; };
struct BaseWithoutVariable { };

template <bool AddMembers> class MyClass
    : std::conditional<AddMembers, BaseWithVariable, BaseWithoutVariable>::type
{
    // etc.
};
struct BaseWithVariable{int addedVariable;};
结构basewithout变量{};
模板类MyClass
:std::conditional::type
{
//等等。
};

首先,您的代码不会为
MyClass
编译。
enable\u if
特性对推导参数有用,而不是类模板参数

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

template <bool> struct Members { };

template <> struct Members<true> { int x; };

template <bool B> struct Foo : Members<B>
{
    double y;
};
模板结构成员{};
模板结构成员{int x;};
模板结构Foo:成员
{
双y;
};

+1完美!与条件模板参数混合我发现这比公认的答案要好,谢谢!