如何根据模板类型的祖先限制类的实例化

Vec*_*zer 3 c++ inheritance templates type-traits c++17

我有一个模板类,XX并希望将它的实例化限制为仅T作为另一个类的后代的类型ZZ

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;
    // ...
};
Run Code Online (Sandbox Code Playgroud)

使用 Visual Studio 2019 C++ (ISO C++17) 我得到

错误 C2275:“std::is_base_of<ZZ, T>”:非法使用此类型作为表达式

这不是正确的使用方法std::is_base_of<>吗?

cig*_*ien 7

std::is_base_of是一种类型,不能用作static_assert. 您正在寻找std::is_base_of_v

static_assert(std::is_base_of_v<ZZ, T>, "T must be a ZZ");
                          // ^^
Run Code Online (Sandbox Code Playgroud)

或 C++17 之前的版本,您可以执行以下操作:

static_assert(std::is_base_of<ZZ, T>::value, "T must be a ZZ");
                                 // ^^^^^^^
Run Code Online (Sandbox Code Playgroud)