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”);
// ^^^^^^^