首页 > 解决方案 > 如何根据模板类型的祖先限制类的实例化

问题描述

我有一个模板类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;
    // ...
};

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

错误 C2275: 'std::is_base_of<ZZ, T>': 非法将此类型用作表达式

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

标签: c++templatesinheritancec++17typetraits

解决方案


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

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

static_assert(std::is_base_of<ZZ, T>::value, "T must be a ZZ");
                                 // ^^^^^^^

推荐阅读