C++:为模板参数指定基类
C++: specifying a base class for a template parameter
我需要设计一个框架来并行计算分而治之算法的结果。为了使用该框架,用户需要以某种方式指定实现"划分"阶段(从T到T的函数),"征服"阶段(从D到D的函数)以及T和D本身的过程。
我认为定义两个抽象类 BaseDivide
和 BaseConquer
会很好,它们声明了一个纯虚拟方法compute
具有正确的类型:这样我就有一个类型来实现一个定义明确的概念(从框架的角度来看),通过抽象类的派生包含用户可定义的函数。
我想过使用模板将类型传递给框架,这样用户就不必实例化它们来使用框架,所以像这样:
template <typename T, typename D, typename Divide, typename Conquer>
D compute(T arg);
我的问题是我希望分而治之是派生的BaseDivide
和BaseConquer
类型:有没有办法在编译时强制执行它?另外:你认为我可以用更清洁的设计达到类似的效果吗?
您可以像这样创建基类:
struct BaseDivide {
enum EnumDiv { derivedFromBaseDivide = true };
}
template <typename T, typename D, typename Divide, typename Conquer>
static_assert(D::derivedFromBaseDivide);
D compute(T arg);
附加的分而治之模板参数的目的是什么?您确定需要它们吗?
当您的类型不满足要求时,使用 Boost.EnabelIf 触发 SFINAE。检查 T 是否派生自 U 是 doen 与 boost::is_base_of :
#include <boost/type_traits/is_base_of.hpp>
#include <boost/enable_if.hpp>
template <typename T, typename D, typename Divide, typename Conquer>
typename boost::
enable_if_c< boost::is_base_of<BaseDivide,Divide>::value
&& boost::is_base_of<BaseConquer,Conquer>::value
,D
>::type
compute(T arg);
您不需要为此目的使用模板。相反,您可以使用指向 BaseDivide 和 BaseConquer 对象的指针,多态性将为您完成这项工作。
相关文章:
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 命名参数习惯用法和(抽象)基类
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 如何允许模板参数中的类类型,仅当它有两个基类时
- 为什么我需要在成员发起器列表中重复基类的模板参数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 根据参数数调用 mixin 基类的构造函数
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 在C++单元测试上下文中,抽象基类是否应将其他抽象基类作为函数参数
- C++ 如何使派生类自动获取基类参数
- 将派生类作为参数传递给方法,该方法是具有智能指针的基类
- 将函数上调整到基类参数的另一个
- 将派生类对象传递给具有 C++ 中基类参数的函数时,为什么要传递引用而不是值?
- 如何使用派生类中的虚拟函数,该函数在另一个具有基类参数的类中声明
- 将基类 2 参数构造函数调用到子类 1 参数构造函数中
- 指向友元函数中基类参数类型的指针
- 按值传递共享指针并接受作为基类参数是如何工作的
- 为带有基类参数的派生类参数调用函数重载