сложный синтаксис шаблона C ++ - PullRequest
4 голосов
/ 06 декабря 2010

После присоединения к SO я часто вижу такой синтаксис всякий раз, когда открываю темы, обсуждающие шаблоны.Я попробовал поискать в Google, но тщетно.

template<typename T>
char (&f(T[1]))[1]; //what is it? what is the use of '[]' brackets and the integer in it?

template<typename T>
char (&f(...))[2]; //not this either

int main() { char c[sizeof(f<void()>(0)) == 2]; } // and this?

Отсюда: SFINAE с недопустимыми параметрами типа функции или типа массива?

Пожалуйста, объясните 3 строки, где я разместил комментарии.Я особенно хочу понять синтаксис.Можно ли использовать такой синтаксис только в шаблонах?

1 Ответ

4 голосов
/ 06 декабря 2010

Следующие два эквивалентны

// 1
template<typename T>
char (&f(...))[2]; 

// 2
typedef char rettype[2];
template<typename T>
rettype &f(...);

Возможно, вы уже видели этот шаблон с указателями на функции

char (*XXX)();

Теперь просто замените () на [N], чтобы создать массив вместо функциональной части, и замените * на &, чтобы создать ссылку вместо указателя, и замените XXX на объявление функции. Затем вы получаете функцию, которая возвращает ссылку на массив размером N.


Возможно, вы захотите взглянуть на man signal, в котором содержится объявление функции с аналогичным типом. Если вы уберете внутренний декларатор, который фактически объявляет функцию, вы получите тот же шаблон

void (* signal(int sig, void (*func)(int)) )(int);
//      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ take out that 

Он вернет указатель на функцию, которая принимает int и возвращает void, как описано на этой странице руководства.


Ниже приведен способ вывода ошибки компилятора , если какое-то условие не выполняется. Если , то тест foo == 2 окажется false, созданный массив имеет нулевой размер, что недопустимо в C ++ и приведет к ошибке времени компиляции. Если значение равно true, ничего не происходит, кроме объявленного массива.

char c[some silly condition here];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...