4 votes

Obtenir le type de résultat d'une fonction en c++11

Considérons la fonction suivante en C++11 :

template<class Function, class... Args, typename ReturnType = /*SOMETHING*/> 
inline ReturnType apply(Function&& f, const Args&... args);

Je veux ReturnType pour être égal au type de résultat de f(args...) Qu'est-ce que je dois écrire à la place de /*SOMETHING*/ ?

15voto

Nawaz Points 148870

Je pense que vous devriez réécrire votre modèle de fonction en utilisant trailing-return-type comme :

template<class Function, class... Args> 
inline auto apply(Function&& f, const Args&... args) -> decltype(f(args...))
{
    typedef decltype(f(args...)) ReturnType;

    //your code; you can use the above typedef.
}

Notez que si vous passez args comme Args&&... au lieu de const Args&... alors il est préférable d'utiliser std::forward sur f comme :

decltype(f(std::forward<Args>(args)...))

Lorsque vous utilisez const Args&... entonces std::forward n'a pas beaucoup de sens (du moins pour moi).

Il est préférable de passer args comme Args&&... appelé référence universelle et utiliser std::forward avec elle.

4voto

Ben Voigt Points 151460

Il n'a pas besoin d'être un paramètre de modèle, puisqu'il n'est pas utilisé pour la résolution des surcharges. Essayez

template<class Function, class... Args> 
inline auto apply(Function&& f, const Args&... args) -> decltype(f(std::forward<const Args &>(args)...));

0voto

lawilog Points 37

Il y a des situations où std::result_of est plus utile. Par exemple, disons que vous voulez passer cette fonction :

int ff(int& out, int in);

et dans la fonction apply(), appelez-la comme suit

int res;
f(res, args...);

alors je ne saurais pas comment utiliser decltype, car je n'ai pas de référence int lvalue sous la main. Avec result_of, vous n'avez pas besoin de variables :

template<class Function, class... Args> 
typename std::result_of<Function(const Args&...)>::type apply(Function&& f, const Args&... args)
{
  typedef typename std::result_of<F(const Args&...)>::type ReturnType;

  // your code
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X