我试图制作一个模板类,该模板类仅允许将实现另外两个类的类作为参数。
我知道可以使用STL来实现此目的,例如std::enable_if
。但我有问题,把它写下来,因为每次我看到的例子使用的基本型一样int
,bool
等等。
我真正的问题是,我走的路正确吗?还是这不是一个好主意?
编辑:
基本代码是:
template < class resource_t >
class ResourcesManager final : public ServiceInterface, public Libraries::Observer, public Libraries::Observable
{
...
}
我想“ resource_t
”是一个类继承类AnOtherClassA
和AnOtherClassB
,如果没有,我想有一个编译警告。因为现在,编译失败了,因为我尝试使用“ resource_t
”中不存在的方法,我知道如何解决它,但我只是想发出更好的警告。
我看到两种不同的方式。
您可以接受每个模板参数,然后检查(可能与static_assert()
)T
从X
和派生的Y
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
不是两个派生类X
和Y
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句