Можно ли использовать возвращаемый тип функции в качестве аргумента при объявлении другой функции в C++?

Я хочу что-то вроде этого:

std::tuple<int, bool, double> MyFunction_1 (void);

void MyFunction_2 (decltype (MyFunction_1) &params);

Очевидно, что в этом примере будет передан код-указатель на функцию.

Я хочу иметь эквивалент этого:

void MyFunction_2 (std::tuple<int, bool, double>  &params);

Можно ли это сделать?

Ответ 1

decltype (MyFunction_1) даст вам тип MyFunction_1 (т.е. тип функции std::tuple<int, bool, double>()), вам нужно эмулировать функцию, вызывающую 1 (через add ()), чтобы получить тип возврата (т.е. std::tuple<int, bool, double>), например

void MyFunction_2 (decltype (MyFunction_1()) &params);
//                                       ^^

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 в этом отношении.