如何允许模板参数中的类类型,仅当它有两个基类时

How to allow a class type in a template parameter, only if it have two base classes

本文关键字:基类 两个 参数 何允许 类型      更新时间:2023-10-16

我试图制作一个模板类,该类仅允许将另外两个类作为参数实现的类。

我知道有一种方法可以用 STL 做到这一点,就像std::enable_if一样。但是我很难把它写下来,因为我看到的每个例子都使用基本类型,如intbool等。

我真正的问题是,我走对了路吗?或者这不是使用好的概念?

编辑:

基本代码是:

template < class resource_t >
class ResourcesManager final : public ServiceInterface, public Libraries::Observer, public Libraries::Observable
{
...
}

我希望"resource_t"是一个继承自类AnOtherClassAAnOtherClassB的类,如果没有,我想有一个编译警告。因为现在,编译中的某些内容在远低于以下失败,因为我尝试使用"resource_t"中不存在的方法,我知道如何解决它,但我只是想有一个更好的警告。

我看到了两种不同的方式。

您可以接受每个模板参数,然后检查(可能使用static_assert()(T派生自XY

template <typename T>
class foo
{
static_assert(    std::is_base_of_v<X, T>
&& std::is_base_of_v<Y, T>, "!" );
// ...
}

这样,如果您声明了一个带有错误参数的foo

foo<int>  fil;  // compilation error

你得到一个硬错误(以及你!的编译器报告,即static_assert()的第二个参数的内容;这对于调试目的很有用(。

否则,您可以使用SFINAE。

通过示例

template <typename T, typename = void>
class foo;
template <typename T>
class foo<T, std::enable_if_t<std::is_base_of_v<X, T>
&& std::is_base_of_v<Y, T>>>
{
// ...
}

这样,使用错误的参数调用foo,您只会得到一个软错误(foo<int>未启用(

通过这种方式,您可以实现另一个版本的foo,当T不是XY的派生类时实现该版本。