Следующие два эквивалентны
// 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];