2010-06-09 72 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