如何条件化类模板和基元类型模板

时间:2017-12-28 14:13:35

标签: c++

我正在尝试构建一个继承该类的类模板。如果给类模板一个原始类型作为模板参数,那么它会给出一个非法的继承错误。我试着做了

template <class Class_>
struct EndianGuard_ : public Class_ {
  EndianGuard_ () {
    cout << "Guarding a Class" << endl;
  }
}

template <typename PrimitiveType_>
struct EndianGuard_ {
  EndianGuard_ (PrimitiveType_ Value) : Value(Value) {
    cout << "Guarding a primitive type" << endl;
  }
  PrimitiveType_ Value;
}

当然我知道它不起作用,但我很绝望。如何区分原始类型和结构?

1 个答案:

答案 0 :(得分:3)

这就是模板专业化的用武之地。

#include <type_traits>

template <class Class_, bool = std::is_class<Class_>::value>
struct EndianGuard_ : public Class_ 
{
    // inherit if class
};

template <class Class_>
struct EndianGuard_<Class_, false> 
{
    // don't inherit if not a class
};

struct foo {};

int main() 
{
    EndianGuard_<int> f; //ok
    EndianGuard_<foo> f2; // ok
}

如果std::is_class<Class_>::value评估为false,则专业化将启动,您可以处理非类类型。可以添加其他条件以获得更多限制 作为旁注,最好处理std::is_final案例,因为你不能从final类继承。