Разница между указателем функции в качестве аргумента шаблона и подписью функции в качестве аргумента шаблона

В чем разница между приведенным ниже синтаксисом:

template<typename T>
struct A { ... };

A<void (*)()> o1; // <--- ok
A<void()> o2;  // <----- ??

Я хочу знать практическое использование второго синтаксиса отдельно от библиотек (я проверил, что мы не можем объявить объект void() внутри A). Я передал этот вопрос, но это не поможет.

1 ответ

void() это тип функции, не имеющий аргументов и не возвращающий ничего.

void(*)() тип указателя на функцию, не имеющую аргументов и не возвращающую ничего

Как пример того, где void() используется и полезен, посмотрите на std::function - синтаксис, который он использует, намного лучше, чем если бы вам пришлось передавать подпись указателя функции. Вы можете использовать точно такой же синтаксис, когда имеете в виду "я хочу сообщить этому шаблонному классу подпись вызова".

В основном это просто синтаксический сахар. Но сахар - это пряность жизни.

Другие вопросы по тегам