Можно ли использовать возвращаемый тип функции в качестве аргумента при объявлении другой функции в C++?
Я хочу что-то вроде этого:
std::tuple<int, bool, double> MyFunction_1 (void);
void MyFunction_2 (decltype (MyFunction_1) ¶ms);
Очевидно, что в этом примере будет передан код-указатель на функцию.
Я хочу иметь эквивалент этого:
void MyFunction_2 (std::tuple<int, bool, double> ¶ms);
Можно ли это сделать?
Ответы
Ответ 1
decltype (MyFunction_1)
даст вам тип MyFunction_1
(т.е. тип функции std::tuple<int, bool, double>()
), вам нужно эмулировать функцию, вызывающую 1 (через add ()
), чтобы получить тип возврата (т.е. std::tuple<int, bool, double>
), например
void MyFunction_2 (decltype (MyFunction_1()) ¶ms);
// ^^
1 Выражение оценивается во время компиляции, на самом деле функция не будет вызываться во время выполнения.
Ответ 2
Тип MyFunction_1
не является std::tuple<int, bool, double>
- неформально вы можете рассматривать его как указатель функции. Фактически &MyFunction_1
распадается на себя и, безусловно, является указателем.
Таким образом, decltype(MyFunction_1)
- это не то, что вы хотите.
Решение состоит в том, чтобы написать decltype(MyFunction_1())
. Тип MyFunction_1()
- std::tuple<int, bool, double>
. Обратите внимание, что это фактически не вызывает функцию; это скорее похоже на sizeof
в этом отношении.
Ответ 3
using RetType = std::invoke_result<decltype(f)>::type;
Играйте с ним: https://gcc.godbolt.org/z/AE7lj_