Je veux quelque chose comme ça:
std::Tuple<int, bool, double> MyFunction_1 (void);
void MyFunction_2 (decltype (MyFunction_1) ¶ms);
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> ¶ms);
Est-il possible de le faire?
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()) ¶ms);
// ^^
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.
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_1
se 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.
using RetType = std::invoke_result<decltype(f)>::type;
Jouez avec: https://gcc.godbolt.org/z/AE7lj_