Параметры шаблона типа функции C++ 11 с переменным числом аргументов

Возможный дубликат:
Что означает токен?

Существует относительно новый способ прямого указания типов функций (по крайней мере, в качестве параметров шаблона). Не знаю, строго ли это С++ 11, но я столкнулся с этим, читая заголовки STL GCC 4.7.

Это вот так:

std::function<void(int, char**)> f;

И вот, в заголовочном файле <functional> я вижу следующее:

template <typename R, typename... A>
struct SomeStruct<R(A...)> { /* */ };

Это понятно: явная специализация SomeStruct для типов функций с типом возвращаемого значения R и типами аргументов A.

Но рассмотрите это объявление (в следующей строке):

template <typename R, typename... A>
struct SomeStruct<R(A......)> { /* */ };

Что означает это двойное многоточие?


person intelfx    schedule 11.07.2012    source источник
comment
Ах, верно. Это дубликат, извините.   -  person intelfx    schedule 11.07.2012


Ответы (1)


Лично мне это неясно, но если вы знаете, что они эквивалентны, это имеет больше смысла:

void example(int, char, ...); // C-style variadic arguments
void example(int, char...);   // equivalent: the comma before the ellipses is optional

Так что эта специализация просто покрывает случай, когда функции принимают форму:

R(A..., ...)

Например, в sprintf: R — это int, A... — это char* и const char*, и это вариативность в стиле C.

person GManNickG    schedule 11.07.2012