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>();
}
Другие вопросы по тегам