我需要设计一个框架来并行计算除法和征服算法的结果。 为了使用框架,用户需要以某种方式指定实现“划分”阶段(从T到T的函数),“征服”阶段(从D到D的函数)和T和D本身的过程。
我认为定义两个抽象类BaseDivide
和BaseConquer
会很好,这些抽象类声明了一个具有正确类型的纯虚方法compute
:这样我有一个实现一个明确定义的概念的类型(从框架的角度来看),通过派生抽象类包含用户可定义的函数。
我曾想过使用模板将类型传递给框架,因此用户不必实例化它们就可以使用框架,所以像这样:
template <typename T, typename D, typename Divide, typename Conquer>
D compute(T arg);
我的问题是我希望Divide and Conquer是BaseDivide
和BaseConquer
的派生类型:有一种方法可以在编译时强制执行它吗?另外:你认为我能用更清洁的设计达到类似的效果吗?
答案 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);