我正在尝试构建一个继承该类的类模板。如果给类模板一个原始类型作为模板参数,那么它会给出一个非法的继承错误。我试着做了
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;
}
当然我知道它不起作用,但我很绝望。如何区分原始类型和结构?
答案 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
类继承。