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

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

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

void MyFunction_2 (decltype (MyFunction_1) &params);

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

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

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

Возможно ли это сделать?

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Тип из MyFunction_1 не является std::tuple<int, bool, double> - неофициально вы можете рассматривать его как указатель на функцию.На самом деле &MyFunction_1 распадается на себя и является определенно указателем.

Так что decltype(MyFunction_1) не то, что вы хотите.

Решениеэто написать decltype(MyFunction_1()).Тип из MyFunction_1() равен std::tuple<int, bool, double>.Обратите внимание, что это на самом деле не вызывает функцию;это скорее похоже на sizeof.

0 голосов
/ 17 октября 2018
using RetType = std::invoke_result<decltype(f)>::type;

Играть с ним: https://gcc.godbolt.org/z/AE7lj_

0 голосов
/ 15 октября 2018

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

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

1 Выражение вычисляется во время компиляции, функция won 'не может быть вызван во время выполнения.

...