我是C ++中的可变参数模板的新手,所以这个问题对于这里经验丰富的人来说似乎有点不合时宜。
我想要做的是创建一个proxy function
,它将能够使用可变参数模板将我的参数重定向到任何其他函数。
我的代码如下:
template <typename Ret, typename ... Types>
Ret proxy_function(Types ... args)
{
return MessageBoxA(args...);
}
int main(int argc, char* argv[])
{
boost::any retval = proxy_function<boost::any>(NULL, "123", "456", 0);
}
编译时,编译器输出以下错误:
1>Main.cpp(107): error C2664: 'int MessageBoxA(HWND,LPCSTR,LPCSTR,UINT)' : cannot convert argument 1 from 'int' to 'HWND'
但是,当我提供以下代码时,它可以正常工作:
template <typename Ret, typename ... Types>
Ret proxy_function(Types ... args)
{
return MessageBoxA(NULL, args...);
}
int main(int argc, char* argv[])
{
boost::any retval = proxy_function<boost::any>("123", "456", 0);
}
世界上有什么理由为什么编译器无法将其转换为HWND类型?
我现在想到的另一个问题与此问题有关 - 是否有可能找出函数内部的参数类型? 我希望能够做到这一点:
template <typename Ret, typename ... Types>
Ret proxy_function(Types ... args)
{
psuedo-code:
for arg in args:
do_stuff<type(arg)>(arg);
}
提前致谢,Aviv
答案 0 :(得分:3)
值0的积分文字隐式转换为指针。但是在调用中它最终作为运行时函数参数,它不是编译时常量,因此不会转换为nullpointer(即使它为0)。使用C ++ 11 nullptr
。
顺便说一句,查找“完美转发”。
答案 1 :(得分:2)
NULL
定义为0
,文字0
可隐式转换为指针。这会导致像你刚刚提到的那样的问题,所以现在有一个新的类型nullptr_t
,对象nullptr
可以隐式转换为任何指针类型,并提供null
(小写表示{的概念{1}}而不是认为它给了null
)。
至于您在特定用途中的第二个问题,您可以像这样使用递归:
NULL