Noe*_*mer 4 c++ generics templates constraints
在C#中,我习惯在泛型方法或类型中指定多个约束,如下所示:
如何在单个方法上指定多个泛型类型约束?
今天我第一次使用C++开始,当谷歌搜索模板多个约束时,我找不到任何有用的东西.
几乎看起来这是不可能的,每个人都知道,因此没有问题.
我知道在C#中,编译器通过编译器验证比使用C++更强大,这就是为什么我不能将我的类型限制为倍数超类型的原因.
这在今天的C++中是可行的,但语法非常复杂.在下一个主要的C++版本中,我们很可能会得到一个概念版本,这使得这更容易.
在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);
Run Code Online (Sandbox Code Playgroud)
您通常使用以下方法对C ++模板进行约束 std::enable_if
这是窍门-如果您的模板如下所示:
template <class T>
<return type> <function name> (args...)
Run Code Online (Sandbox Code Playgroud)
您可以使用以下返回类型并将其作为公司名称enable_if:
template <class T>
typename std::enable_if<XXX,<return type>>::type
<function name> (args...)
Run Code Online (Sandbox Code Playgroud)
在这里,XXX代表您的编译时条件。
例如: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;
}
Run Code Online (Sandbox Code Playgroud)