C ++ - объявить указатель на функцию, возвращающую любой тип и получающую любое количество параметров - PullRequest
0 голосов
/ 01 февраля 2020

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

decltype(auto) (*funcPtr)(...);

Если возможно, я также хотел бы узнать об альтернативных способах объявления такого указателя.

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

C ++ является статически типизированным языком. Все типы аргументов функций и возвращаемые типы должны быть известны во время компиляции. Вы не можете объявить функцию, которая возвращает произвольные типы (ну, я думаю, вы могли бы вернуть std::any, но я не могу вспомнить случай, когда вы захотите).

Вы можете использовать шаблоны, однако, для создания шаблонов функций, где компилятор вычеркнет для вас несколько версий функции, так что вам не придется писать их все самостоятельно.

Помните что auto и decltype(auto) - это , а не волхвы c. Они просто синтактические c сахар для того, что вы бы написали сами, если бы их не было. Они не включают любые новые функции, которых еще не было в языке. Они просто упрощают использование таких функций.

0 голосов
/ 01 февраля 2020

Нет, такого типа, как указатель на функцию "что-либо возвращающее", не существует. Есть только указатели на функцию, которая возвращает некоторый тип или 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>();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...