В чем разница между приведенным ниже синтаксисом:
template<typename T>
struct A { ... };
A<void (*)()> o1; // <--- ok
A<void()> o2; // <----- ??
Я хочу знать практическое использование второго синтаксиса отдельно от библиотек (я проверил, что мы не можем объявить объект void()
внутри A
). Я сослался на это вопрос, но это не поможет.
void()
тип функции, не принимающей аргументов и не возвращающей ничего
void(*)()
тип указателя на функцию, не имеющую аргументов и не возвращающую ничего
Как пример того, где void()
используется и полезен, посмотрите на std::function
— синтаксис, который он использует, намного лучше, чем если бы вам пришлось передавать подпись указателя функции. Вы можете использовать точно такой же синтаксис, когда имеете в виду «Я хочу сообщить этому классу шаблона подпись вызова».
В основном это просто синтаксический сахар. Но сахар — это пряность жизни.
Других решений пока нет …