C++ - объявить указатель на функцию, возвращающую любой тип и получающую любое количество параметров
Мне было интересно, возможно ли написать что-нибудь похожее на это объявление (используя пакет параметров).
decltype(auto) (*funcPtr)(...);
Если возможно, хотелось бы также узнать об альтернативных способах объявления такого указателя.
2 ответа
C++ - это язык со статической типизацией. Все типы аргументов функции и возвращаемые типы должны быть известны во время компиляции. Вы не можете объявить функцию, которая возвращает произвольные типы (ну, я думаю, вы могли бы вернутьstd::any
, но я не могу придумать случая, в котором вы бы хотели).
Однако вы можете использовать шаблоны для создания шаблонов функций, в которых компилятор будет штамповать для вас несколько версий функции, поэтому вам не нужно писать их все самостоятельно.
Помни это auto
а также decltype(auto)
это не волшебство. Они просто синтаксический сахар для того, что вы иначе написали бы сами, если бы их не существовало. Они не активируют какие-либо новые функции, которых еще не было на языке. Они просто упрощают использование таких функций.
Нет, не существует такого типа, как указатель на функцию, "которая что-либо возвращает". Есть только указатели на функцию, которая возвращает какой-то тип илиvoid
. auto
просто выводит тип из инициализатора, и в вашем примере нет ничего, из чего можно было бы вывести тип.
Однако у вас может быть шаблон функции, где экземпляр шаблона является функцией, которая возвращает тип, указанный аргументом шаблона:
// function template
template<class T>
T foo() {
return {};
}
Точно так же у вас может быть шаблон переменной, который является указателем на функцию, тип возвращаемого значения которой указан переменной шаблона:
// variable template
template<class T>
T (*funcPtr)() = foo;
// example usage
int main() {
return funcPtr<int>();
}