2013-08-05 38 views
2

GManNickG's answer,他所用的符号:未指定的函数参数

template <typename> 
static no& test(...); 

原本我以为这只是简写为“插入嗒嗒”,用户必须替换他们自己的类型:

template<typename> 
static no& test(int); 

然而,在编译器中进行测试后没有任何改变,它就起作用了!此外,在原始问题的上下文中使用...与显式int相比,重载分辨率的行为与预期相同。

在C++ 03中调用这个函数的方法是什么?我应该如何解释这段代码?它看起来接近于C++ 11的可变参数模板,但两者之间有一些明显的区别。

+1

'......'是省略号(我相信有多个省略号) – maditya

回答

2

是的,省略号指定了一个可变参数函数(可变长度参数列表)。您可以使用va_start,va_argva_end宏来“拉出”参数。然而,你需要一个初始的参数。他们需要一个开始抓取堆栈参数的起点(在省略号+ sizeof(arg)之前的arg)。

/* sum a bunch of ints */ 
int sum(int arg_cnt, ...) { 
    va_list ap; 
    va_start(ap, arg_cnt); 
    int sum = 0; 
    for(int i = 0; i < arg_cnt; ++i) { 
     sum += va_arg(ap, int); 
    } 
    va_end(ap); 
    return sum; 
} 
+0

初步解释? GManNickG正在使用SFINAE,其中省略号用于控制重载分辨率。 – dyp

+0

@DyP:哦,废话,错过了。固定 –

+3

您可能想要在SFINAE中添加* why *:省略号转换序列(在函数参数与省略号匹配时发生)被排列为最差的隐式转换序列。因此,任何其他隐式转换都将被重载解析所偏好,并且只有在其他重载不匹配(在此示例中)或未被考虑(例如由于替换失败)的情况下才会考虑此函数重载(使用省略号) )。 – dyp