我正在研究过滤传递给重载函数模板的类型的方法。我正在使用Visual Studio 2013。
三部分问题:
Blorg3
?TFoo2(argc)
生成编译器错误的原因与#1相同吗?这是示例代码:
#include <type_traits>
#define IFPTR(T,R) typename std::enable_if<std::is_pointer<T>::value, R>::type
#define IFINT(T,R) typename std::enable_if<std::is_integral<T>::value, R>::type
template <class T, IFINT(T, T)* = nullptr> int Blorg1(T n) { return n + 1; }
template <class T, IFPTR(T, T)* = nullptr> int Blorg1(T n) { return *n + 1; }
template <class T> IFINT(T, int) Blorg2(T n) { return n + 1; }
template <class T> IFPTR(T, int) Blorg2(T n) { return *n + 1; }
template <class T> int Blorg3(IFINT(T, T) n) { return n + 1; }
template <class T> int Blorg3(IFPTR(T, T) n) { return *n + 1; }
struct TFoo1 {
template <class T, IFINT(T, T)* _ = nullptr> TFoo1(T n) { }
};
struct TFoo2 {
template <class T> TFoo2(IFINT(T, T) n) { }
};
int main(int argc, char* argv[])
{
Blorg1(argc); // intellisense not happy
Blorg2(argc);
Blorg3<int>(argc); // why cant deduce?
Blorg1(*argv); // intellisense not happy
Blorg2(*argv);
Blorg3<char*>(*argv); // why cant deduce?
(void)TFoo1(argc); // intellisense not happy
(void)TFoo2(argc); // intellisense not happy and !!wont compile!!
return 0;
}
为什么我的编译器无法推断Blorg3?
在std::enable_if<std::is_pointer<T>::value, R>::type
中::type
是指取决于模板参数T
和的嵌套名称R
。这是一个非推导的上下文(第1.4.8.2.5 / 5节),因此,编译器不会推导template参数。
这就是为什么TFoo2(argc)生成编译器错误的原因吗?
是的,构造函数模板必须能够推断出其模板参数,而在这种情况下则不能。
是否有语法可向构造函数提供模板参数?
不,正如我已经提到的那样,您不能明确地这样做,必须推导它们,或者模板参数必须具有默认参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句