2

GManNickG の回答では、次の表記を使用しました。

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

当初、これは「insert blah」の省略形であり、ユーザーは独自のタイプに置き換える必要があると考えていました。

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

ただし、変更せずにコンパイラでテストしたところ、機能しました。さらに、オーバーロードの解決は...、元の質問のコンテキストで明示的な int と比較して使用すると、期待どおりに動作します。

これは C++03 では何と呼ばれていますか / このコードをどのように解釈すればよいですか? C++11 の可変個引数テンプレートに近いように見えますが、この 2 つには明らかな違いがいくつかあります。

4

1 に答える 1

2

はい、省略記号は可変長関数 (可変長引数リスト) を指定します。va_startva_arg、およびマクロを使用して、va_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 に答える