неопределенный параметр функции

В ответе GManNickG он использовал обозначение:

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

Первоначально я думал, что это просто сокращение от «insert blah», и пользователь должен подставить свой собственный тип:

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

Однако после тестирования в компиляторе без каких-либо изменений все заработало! Кроме того, разрешение перегрузки ведет себя так, как ожидалось, при использовании ... вместо явного int в контексте исходного вопроса.

Как это называется в С++ 03/как мне интерпретировать этот код? Он выглядит близко к вариативным шаблонам C++11, но между ними есть некоторые очевидные различия.


person helloworld922    schedule 05.08.2013    source источник
comment
... - это многоточие (многоточие, я думаю)   -  person maditya    schedule 06.08.2013


Ответы (1)


Да, многоточие указывает вариативную функцию (список аргументов переменной длины). Вы можете использовать макросы va_start, va_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;
}
person Ed S.    schedule 05.08.2013
comment
Первоначальная интерпретация? GManNickG использует SFINAE, где многоточие используется для управления разрешением перегрузки. - person dyp; 06.08.2013
comment
@DyP: О, дерьмо, пропустил это. Исправлено - person Ed S.; 06.08.2013
comment
Вы можете добавить почему это используется в SFINAE: последовательность преобразования с многоточием (происходит, когда аргумент функции совпадает с многоточием) оценивается как наихудшая последовательность неявного преобразования. Следовательно, любое другое неявное преобразование будет предпочтительным для разрешения перегрузки, и эта перегрузка функции (с многоточием) будет рассматриваться только в том случае, если другие перегрузки не совпадают (в этом примере) или не учитываются (например, из-за ошибки подстановки). ). - person dyp; 06.08.2013