C++ 如何基于模板化类型的祖先限制类的实例化
我有一个模板类C++ 如何基于模板化类型的祖先限制类的实例化,c++,templates,inheritance,c++17,typetraits,C++,Templates,Inheritance,C++17,Typetraits,我有一个模板类XX,我想将它的实例化限制为只有属于另一个类ZZ的后代的类型T: class ZZ { public: int transmorgificationFactor; }; template <typename T> class XX { public: static_assert(std::is_base_of<ZZ, T>, "T must be a ZZ"); T foo; // ... }; ZZ类
XX
,我想将它的实例化限制为只有属于另一个类ZZ
的后代的类型T
:
class ZZ {
public:
int transmorgificationFactor;
};
template <typename T>
class XX {
public:
static_assert(std::is_base_of<ZZ, T>, "T must be a ZZ");
T foo;
// ...
};
ZZ类{
公众:
内转换因子;
};
模板
XX类{
公众:
静态断言(std::is_base of,“T必须是ZZ”);
T foo;
// ...
};
使用Visual Studio 2019 C++(ISO C++ 17),我得到
错误C2275:'std::is_base_of':非法使用此类型作为 表情这不是使用
std::Is_base_of
的正确方法吗?std::Is_base_of
是一种类型,不能在静态断言中用作条件。您正在寻找的是std::is_base_of_v
:
static_assert(std::is_base_of_v<ZZ, T>, "T must be a ZZ");
// ^^
static_assert(std::is_base_of_v,“T必须是ZZ”);
// ^^
或C++17之前的版本,您可以执行以下操作:
static_assert(std::is_base_of<ZZ, T>::value, "T must be a ZZ");
// ^^^^^^^
static_断言(std::is_base_of::value,“T必须是ZZ”);
// ^^^^^^^