如何允许模板参数中的类类型,仅当它有两个基类时
How to allow a class type in a template parameter, only if it have two base classes
我试图制作一个模板类,该类仅允许将另外两个类作为参数实现的类。
我知道有一种方法可以用 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
的派生类时实现该版本。
相关文章:
- 如何允许模板参数中的类类型,仅当它有两个基类时
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- 从两个不同类继承的非虚拟基类的访问成员
- 具有相同纯虚拟功能的两个基类
- 为什么当我有两个函数时编译器没有显示错误,一个将采用基类,一个将派生类作为参数
- 模板化成员函数能否实现两个基类的虚函数?
- 来自两个相同基类的 C++ 派生类
- C++ 类两个动态属性
- 如何在具有相同基类的两个不同类中获取向量
- 实现两个名称相同但由于多个抽象基类而不同的非协变返回类型的函数
- 有没有办法区分来自两个模板化基类的这些函数调用
- 同一基类的两个派生对象如何通信
- 如何知道两个对象是否派生自同一基类
- 如何通过定义派生类的构造函数来实例化两个基类的私有数据成员
- C++在派生类和基类中使用两个同名变量
- 当继承基模板类并将两个类文件放在单独的头文件中时,为什么会出现重定义错误
- 如何在两个不同对象的基类中使用模板化类
- 模板类两个重载函数
- 获取从基类指针到具有不同类型的两个派生成员变量的访问权
- 当基类具有两个或多个模板参数时,C++11 别名基模板类变量在模板派生类中不起作用