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

时间:2011-05-04 18:22:30

标签: c++ templates

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

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

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

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

我的问题是我希望Divide and Conquer是BaseDivideBaseConquer的派生类型:有一种方法可以在编译时强制执行它吗?另外:你认为我能用更清洁的设计达到类似的效果吗?

3 个答案:

答案 0 :(得分:3)

您可以像这样创建基类:

struct BaseDivide {
    enum EnumDiv { derivedFromBaseDivide = true };
}

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

额外的Divide and Conquer模板参数的目的是什么?你确定需要它们吗?

答案 1 :(得分:2)

您无需为此目的使用模板。相反,您可以使用指向BaseDivide和BaseConquer对象的指针,而多态将为您完成工作。

答案 2 :(得分:2)

当您的类型不符合您的要求时,使用Boost.EnabelIf触发SFINAE。 检查T是否来自U是使用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);
相关问题