1

我有一个用 Java 编写的函数,它接受可变参数作为参数。我想将该函数移植到 C++。我试图搜索,但我得到的最接近的是使用参数列表的 std::vector。将可变参数转换为 C++ 的最佳方法是什么?功能如下。

public EventHandlerQueue<T> get (final EventHandler<T> ... handlers)
{
     // Do something with handlers
     return new EventHandlerQueue<T>(handlers)
}  
4

3 回答 3

6

我想将该函数移植到 C++。我试图搜索,但我得到的最接近的是使用参数列表的 std::vector。

这是完全正确的,并且正是 Java varags 列表实际上是什么,只是使用了一些不同的语法。

于 2012-06-18T13:34:42.557 回答
4

varargs在 Java 中是纯语法糖。它被编译器翻译成对传递/接收数组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> >.

于 2012-06-18T14:06:55.043 回答
0

正如@chris 所说,在 C++ 中,这些是“可变参数模板”。

维基百科的例子:

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");
}
于 2012-06-18T13:33:32.203 回答