Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;具有多个约束的模板_C++_Templates_Generics_Constraints - Fatal编程技术网

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

C++ C++;具有多个约束的模板,c++,templates,generics,constraints,C++,Templates,Generics,Constraints,在C#中,我用于在通用方法或类型中指定多个约束,如下所示: 今天我第一次用C++开始了,当Google针对模板多重约束时,我找不到任何有用的东西。br> 看起来这几乎是不可能的,每个人都知道这一点,因此没有人提出任何问题。 P>我知道C语言中泛型比C++更强大,这就是为什么我不能把我的类型限制为倍数超级类型的原因。 < p>你通常用 STD::Enable,对 > /> P>进行C++模板的约束 这里是技巧-如果您的模板如下所示: template <class T> <r

在C#中,我用于在通用方法或类型中指定多个约束,如下所示:

<>今天我第一次用C++开始了,当Google针对模板多重约束时,我找不到任何有用的东西。br> 看起来这几乎是不可能的,每个人都知道这一点,因此没有人提出任何问题。


<> P>我知道C语言中泛型比C++更强大,这就是为什么我不能把我的类型限制为倍数超级类型的原因。

< p>你通常用 STD::Enable,对 > /> P>进行C++模板的约束 这里是技巧-如果您的模板如下所示:

template <class T>
<return type> <function name> (args...)
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);
这里,
XXX
表示编译时条件

例如:让
add(T1 T1,t2t2)
仅为继承自
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;
 }
模板
typename std::启用\u如果<
std::is_base_of::value&&std::is_base_of::value
decltype(T1()+T2())>::type
添加(T1、T2、T2){
返回t1+t2;
}

在C++中,这是可能的,但是语法相当复杂。在下一个主要的C++版本中,我们很可能会得到一个版本,这使得这更容易。 在C++14中,您发布的C#示例可能如下所示:

template <class T>
<return type> <function name> (args...)
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);
模板
treresponse调用(TRequest请求);

google
static\u assert
链接肯定是+1。但是,这将需要相当长的时间来阅读。如果我们使用
std::enable_if
而不是
std::enable_if_t
@ikh,那么在C++11中就可以使用它。两者之间的区别是什么?在我看来,他们穿这些衣服是一样的examples@NoelWidmer没有区别;只是个帮手
std::enable_if_t*=nullptr
typename std::enable_if::type*=nullptr>
短一点。参见:是的,这是使用低级语言grr的缺点。它起作用了,谢谢:)C++就像毒品一样。我们都知道C是比较容易和更快的发展,我们只是太沉溺于相当的C++: