我有一个用Java编写的函数,它接受varargs作为参数。我想将该函数移植到C ++。我试图搜索,但我得到的最接近的是使用参数列表的std :: vector。将varargs转换为C ++的最佳方法是什么?功能如下。
public EventHandlerQueue<T> get (final EventHandler<T> ... handlers)
{
// Do something with handlers
return new EventHandlerQueue<T>(handlers)
}
答案 0 :(得分:6)
我想将该函数移植到C ++。我试着搜索但是 我得到的最接近的是使用参数列表的std :: vector。
这是完全正确的,正是Java varags实际列出的内容,只是使用了一些不同的语法。
答案 1 :(得分:4)
varargs
是纯粹的语法糖。它由编译器转换为对函数的调用,该函数传递/接收EventHandler<T>
的数组。
C ++ 11中最接近的是std::initializer_list<EventHandler<T>>
,你需要在一对额外的大括号中封装参数:
EventHandlerQueue<T> get(std::initailizer_list<EventHandler<T>> handlers);
obj.get( {EventHandler1, EventHandler2} );
// asuming that `obj` is an object for which the above member is defined.
在C ++ 03中没有类似的语法糖,你需要创建一个数组/向量并传递它。由于数组具有静态定义的大小,因此这里最好的选择就是传递std::vector<EventHandler<T> >
。
答案 2 :(得分:0)
在C ++中,这些是'可变参数模板',正如@chris所说。
维基百科的例子:
template<typename T, typename... Args>
void printf(const char *s, T value, Args... args)
{
while (*s) {
if (*s == '%' && *(++s) != '%') {
std::cout << value;
++s;
printf(s, args...); // call even when *s == 0 to detect extra arguments
return;
}
std::cout << *s++;
}
throw std::logic_error("extra arguments provided to printf");
}