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

Noe*_*mer 4 c++ generics templates constraints

在C#中,我习惯在泛型方法或类型中指定多个约束,如下所示:
如何在单个方法上指定多个泛型类型约束?

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

我知道在C#中,编译器通过编译器验证比使用C++更强大,这就是为什么我不能将我的类型限制为倍数超类型的原因.

Tar*_*ama 6

这在今天的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)


Dav*_*aim 5

您通常使用以下方法对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)