C ++可变参数模板 - NULL转换为int

时间:2013-12-18 19:49:48

标签: c++ templates c++11 variadic

我是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

2 个答案:

答案 0 :(得分:3)

值0的积分文字隐式转换为指针。但是在调用中它最终作为运行时函数参数,它不是编译时常量,因此不会转换为nullpointer(即使它为0)。使用C ++ 11 nullptr


顺便说一句,查找“完美转发”。

答案 1 :(得分:2)

NULL定义为0,文字0可隐式转换为指针。这会导致像你刚刚提到的那样的问题,所以现在有一个新的类型nullptr_t,对象nullptr可以隐式转换为任何指针类型,并提供null(小写表示{的概念{1}}而不是认为它给了null)。

至于您在特定用途中的第二个问题,您可以像这样使用递归:

NULL