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