c++ - cours - php définition




Moyen le plus simple de déterminer le type de fonction de retour (2)

Étant donné une fonction très simple mais longue, telle que:

int foo(int a, int b, int c, int d) {
    return 1;
}

// using ReturnTypeOfFoo = ???

Quel est le moyen le plus simple et le plus concis de déterminer le type de retour de la fonction ( ReturnTypeOfFoo , dans cet exemple: int ) au moment de la compilation sans répéter les types de paramètre de la fonction (par nom uniquement, car il est connu que la fonction ne comporte pas de surcharge supplémentaire )?


Je ne sais pas si la manière la plus simple (si vous pouvez utiliser C ++ 17 n'est certainement pas: voir la réponse de NathanOliver) mais ... qu'en est-il de la déclaration d'une fonction comme suit:

template <typename R, typename ... Args>
R getRetType (R(*)(Args...));

et en utilisant decltype() ?

using ReturnTypeOfFoo = decltype( getRetType(&foo) );

Observez que getRetType() est uniquement déclaré et non défini car appelé uniquement decltype() , seul le type renvoyé est pertinent.


Le plus simple et concis est probablement:

template <typename R, typename... Args>
R return_type_of(R(*)(Args...));

using ReturnTypeOfFoo = decltype(return_type_of(foo));

Notez que cela ne fonctionnera pas pour les objets de fonction ou les pointeurs vers des fonctions membres. Juste des fonctions, qui ne sont pas surchargées ni des modèles, ou noexcept .

Mais cela peut être étendu pour prendre en charge tous ces cas, si vous le souhaitez, en ajoutant davantage de surcharges de return_type_of .







compile-time