gpt4 book ai didi

c++ - 仅在具有两个基类的情况下,才允许在模板参数中使用类类型

转载 作者:行者123 更新时间:2023-12-01 14:43:30 25 4
gpt4 key购买 nike

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

我知道可以使用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的派生类时,也可以实现该版本。

关于c++ - 仅在具有两个基类的情况下,才允许在模板参数中使用类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60062738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com