2015-06-09 71 views
3

在C#C++模板,我使用一個通用的方法來指定多個約束或類型如右圖所示的位置:
How do I specify multiple generic type constraints on a single method?多約束

今天,我開始用C++的第一次,我無法找到當谷歌搜索模板多個約束條件
它幾乎看起來像這是不可能的,大家都知道,因此沒有問題。

我知道在C#中,泛型編譯器比C++更強大,這就是爲什麼我覺得不能將我的類型限制爲多個超類型。

+2

谷歌'static_assert' –

回答

4

你平時做制約C++模板與std::enable_if

這裏的竅門 - 如果您的模板看起來是這樣的:

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

你拿的返回類型和企業IT與enable_if這樣的:

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

這裏,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; 
} 
+0

是的,那就是用較低的語言的下側,GRR。它的工作,謝謝:) –

+0

C++它就像一種藥物。我們都知道C#開發起來更容易,更快,我們也沉迷於C++ :-) –

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); 
+0

鏈接當然是+1。但是,這需要一段時間才能閱讀。 –

+0

如果我們使用'std :: enable_if'而不是'std :: enable_if_t',它將在C++ 11中可用。 – ikh

+0

@ikh兩者有什麼區別?在這些例子中,他們看起來和我一樣 –