2

GManNickG 的回答中,他使用了以下符号:

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

最初我认为这只是“插入 blah”的简写,用户必须替换自己的类型:

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

但是,在没有任何更改的情况下在编译器中对其进行测试后,它就可以工作了!...此外,在原始问题的上下文中使用 vs. 显式 int 时,重载解析的行为符合预期。

这在 C++03 中叫什么/我应该如何解释这段代码?它看起来接近 C++11 的可变参数模板,但两者之间存在一些明显的差异。

4

1 回答 1

2

是的,省略号指定一个可变参数函数(可变长度参数列表)。您可以使用va_startva_argva_end宏来“拉出”参数。但是,您需要一个初始参数;他们需要一个起点来开始从堆栈中获取参数(arg在省略号 + 之前sizeof(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;
}
于 2013-08-05T23:51:56.837 回答