在C#中,我习惯在泛型方法或类型中指定多个约束,如下所示:
How do I specify multiple generic type constraints on a single method?
今天我第一次使用C ++开始,在搜索模板多个约束时,我找不到任何有用的东西。
几乎看起来这是不可能的,每个人都知道,因此没有问题。
我知道在C#中,编译器验证的内容比在C ++中验证要强得多,这就是为什么我不能将我的类型约束为多个超类型的错误。
答案 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
这是诀窍 - 如果您的模板如下所示:
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;
}