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

塞巴斯蒂安·贝梅尔曼斯

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

我知道可以使用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中不存在的方法,我知道如何解决它,但我只是想发出更好的警告。

最高66

我看到两种不同的方式。

您可以接受每个模板参数,然后检查(可能与static_assert()TX派生的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不是两个派生类XY

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么C ++不允许两个具有相同名称的函数/类模板,它们的区别仅在于非类型模板参数(整数类型)的类型?

仅在具有特定类的情况下才如何删除拖动的元素?

CSS规则仅在元素具有两个类时才适用

jQuery仅在具有类的情况下显示div

具有一个和两个模板参数的模板类

如何在两个不同对象的基类中使用模板化类

两个仅在模板参数上有所不同的类

jQuery仅在容器没有特定类的情况下才选择子级

Java模板,如何使用两个具有相同名称和不同类型的类

Haskell-具有两个参数的类型类的翻转参数

仅在具有特定功能的情况下才使用jquery更改CSS属性值

Kotlin 中具有两个类型参数的泛型类

在基类构造函数中使用抽象类作为参数,以在派生类中具有更多特定类型

在两个类完全相同的情况下获取类强制转换异常

如果两个类都是模板,为什么不能简单地使用基类中定义的类型?

具有两个参数的泛型类

UML类-在没有派生类的情况下使用基类

匕首不允许我在一个类中使用两个相同类型的对象

在这种情况下,有没有办法用一个解决方案替换仅在类型上不同的两个相似功能?

如何在不使用Java中使用NULL的情况下实例化具有彼此循环引用的类?

如何在一个元素具有两个条件的情况下使用WebDriverWait(Python,Selenium)

从抽象类上的方法返回子类型,或者在具有不同参数类型的子项上强制使用两个构造函数

为什么C ++ 17在模板中具有相同目的的两个关键字(类和类型名)

抓依赖注入两个简单的类的情况下

仅当具有两个类并且共享相同的第一个类时才选择元素

在C ++中,如何在另一个嵌套类中使用嵌套类类型(两个嵌套类在同一外部类下)

两个模板类相互用作模板参数

javac错误:仅在显式请求注释处理的情况下,才接受类名称

仅在符合特定协议的情况下才快速扩展类