1

引数としてvarargsを受け入れるJavaで書かれた関数があります。その関数をC++に移植したかったのです。検索しようとしましたが、最も近いのは引数リストのstd::vectorを使用することです。varargsを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

varargsJava では純粋な構文糖衣です。コンパイラによって、配列の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

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