具有多个约束的C ++模板

时间:2015-06-09 11:41:28

标签: c++ templates generics constraints

在C#中,我习惯在泛型方法或类型中指定多个约束,如下所示:
How do I specify multiple generic type constraints on a single method?

今天我第一次使用C ++开始,在搜索模板多个约束时,我找不到任何有用的东西。
几乎看起来这是不可能的,每个人都知道,因此没有问题。

我知道在C#中,编译器验证的内容比在C ++中验证要强得多,这就是为什么我不能将我的类型约束为多个超类型的错误。

2 个答案:

答案 0 :(得分:6)

今天在C ++中可行,但语法非常复杂。在下一个主要的C ++版本中,我们很可能会获得concepts的版本,这使得这更容易。

在C ++ 14中,您发布的C#示例可能如下所示:

template <class TResponse, class TRequest,
          std::enable_if_t<std::is_base_of<MyClass, TRequest>::value &&
                           std::is_base_of<MyOtherClass, TResponse>::value>* = nullptr>
TResponse Call(TRequest request);

答案 1 :(得分:4)

您通常使用std::enable_if

对C ++模板进行约束

这是诀窍 - 如果您的模板如下所示:

template <class T>
<return type> <function name> (args...)

你选择了返回类型并将其与enable_if合并为:

template <class T>
typename std::enable_if<XXX,<return type>>::type
 <function name> (args...)

这里,XXX代表你的编译时条件。

例如:let add(T1 t1 , T2 t2)仅针对从Addable继承的对象进行编译:

template <class T1, class T2>
 typename std::enable_if<
   std::is_base_of<Addable,T1>::value && std::is_base_of<Addable,T2>::value
 decltype(T1()+T2())>::type
 add (T1 t1, T2 t2){
    return t1+t2;
 }