有条件地包括模板类中的成员

时间:2015-07-24 22:11:39

标签: templates c++11

我想根据模板参数的值排除或包含模板类中的某些成员。这是一个例子:

enum t_chooser {A, B, all};

template <t_chooser choice>
class C {

    // include if choice==A
    int v1;
    // include if choice==B
    long v2;
    // include if choice==B    
    int v3;
    // include for every value of choice
    bool v4;
};

如果模板参数choice等于all,则应包括所有成员。 有没有办法在C ++ 11中实现这一点,甚至可能使用std::enable_if

我在这里看到了成员函数的解决方案:std::enable_if to conditionally compile a member function

1 个答案:

答案 0 :(得分:4)

显然,您可以为每种类型的C专门研究整个t_chooser课程,但这很痛苦,因为您必须复制所有内容。相反,您可以将专门化放入辅助结构中,然后在C

中派生它
enum t_chooser {A, B, all};

template <t_chooser choice>
struct Vars; // undefined

template<>
struct Vars<A> { // just the A vars
  int v1;
};

template<>
struct Vars<B> { // just the B vars
  long v2;
  int v3;
};

template<>
struct Vars<all> : Vars<A>, Vars<B> { }; // derive both, get everything

template <t_chooser choice>
class C : private Vars<choice> { // or public if you want to expose them
    bool v4;
};