2010-06-09 51 views
2

我遇到了另一個我不明白的問題。帶有標識參數的C++模板實例化

以下不會實例化(參數實例化失敗),爲什麼?

template<class E> 
void operator[](typename boost::mpl::identity<E>::type e) const; 

感謝你的幫助

回答

9

identity可以用來強迫你明確指定模板參數。它有效地防止了該函數參數參與模板參數推導。

限定的類型名稱是非推導的上下文之一;即identity<E>::type將不會用於推導E的模板參數。

例如,如果您有:

template<class E> 
void f(typename boost::mpl::identity<E>::type e) { } 

f(42);  // won't work 
f<int>(42); // works 
+0

謝謝,我想讓我與你提供的例子 – Anycorn 2010-06-09 02:10:55

+1

好看:http://kaba.hilvi.org/pastel/techniques_deduction.htm – 2011-10-05 00:25:43

0

這似乎是非常多餘。 identity<E>::type保證等同於E,那麼爲什麼不只是聲明你的模板:

template<class E> 
void operator[](E e) const; 
+0

的好奇心,也可能取代與「過濾器」的身份SFINAE – Anycorn 2010-06-09 01:58:16

+0

你能後,你收到的確切編譯器錯誤? – 2010-06-09 02:04:51

+0

有沒有錯誤perse因爲sfinae – Anycorn 2010-06-09 02:08:51