C++:为模板参数指定基类

C++: specifying a base class for a template parameter

本文关键字:基类 参数 C++      更新时间:2023-10-16

我需要设计一个框架来并行计算分而治之算法的结果。为了使用该框架,用户需要以某种方式指定实现"划分"阶段(从T到T的函数),"征服"阶段(从D到D的函数)以及T和D本身的过程。

我认为定义两个抽象类 BaseDivideBaseConquer 会很好,它们声明了一个纯虚拟方法compute具有正确的类型:这样我就有一个类型来实现一个定义明确的概念(从框架的角度来看),通过抽象类的派生包含用户可定义的函数。

我想过使用模板将类型传递给框架,这样用户就不必实例化它们来使用框架,所以像这样:

template <typename T, typename D, typename Divide, typename Conquer> 
D compute(T arg);

我的问题是我希望分而治之是派生的BaseDivideBaseConquer类型:有没有办法在编译时强制执行它?另外:你认为我可以用更清洁的设计达到类似的效果吗?

您可以像这样创建基类:

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 对象的指针,多态性将为您完成这项工作。

相关文章: