web-dev-qa-db-fra.com

Est-il possible d'utiliser le type de retour de fonction comme argument dans la déclaration d'une autre fonction en C ++?

Je veux quelque chose comme ça:

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

void MyFunction_2 (decltype (MyFunction_1) &params);

De toute évidence, dans cet exemple, un pointeur de code vers la fonction serait passé.

Je veux avoir l'équivalent de ceci:

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

Est-il possible de le faire?

31
Dmitrii Motorygin

decltype (MyFunction_1) vous donnera le type de MyFunction_1 (c'est-à-dire le type de fonction std::Tuple<int, bool, double> ()), vous devez émuler une fonction appelant 1 (en ajoutant ()) pour obtenir le type de retour (c'est-à-dire std::Tuple<int, bool, double>), par exemple.

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

1 L'expression est évaluée au moment de la compilation, la fonction ne sera en fait pas appelée au moment de l'exécution.

35
songyuanyao

Le type de MyFunction_1 N'est pas std::Tuple<int, bool, double> - officieusement, vous pouvez le considérer comme un pointeur de fonction. En fait &MyFunction_1se désintègre à lui-même et est certainement un pointeur.

Donc, decltype(MyFunction_1) n'est pas ce que vous voulez.

La solution est d'écrire decltype(MyFunction_1()). Le type de MyFunction_1()eststd::Tuple<int, bool, double>. Notez que cela ne fait pas appeler la fonction; c'est un peu comme sizeof à cet égard.

16
Bathsheba
using RetType = std::invoke_result<decltype(f)>::type;

Jouez avec: https://gcc.godbolt.org/z/AE7lj_

3
jf12