2017-10-01 1 views
0

Je crée une fonction de modèle qui prend en compte un pointeur de fonction, bien que j'essaie de simplifier la syntaxe un peu plus loin.Types de retour automatique pour les arguments de pointeur de fonction?

Jusqu'à présent, j'ai quelque chose comme:

template< typename obj, typename ret, typename... args > 
auto py_wrapped_func(ret (obj::*f)(args...)) 
{ 
    // Do some stuff with the function pointer. 
} 

Le problème est parfois le type de retour, ret, est fou de long. Je me demande s'il y a un moyen de simplifier quelque chose comme:

template< typename obj, typename... args > 
auto py_wrapped_func(decltype(auto) (obj::*f)(args...)) 
{ 
    // Do some stuff with the function pointer. 
} 

Il est évident que cela ne compile pas - « decltype (auto) ne sont pas autorisés dans le prototype de la fonction ». Y a-t-il une meilleure façon de s'y prendre? Je suis conscient que je pourrais juste calquer sur le type de fonction directement, mais je préférerais éviter d'avoir à écrire le type de fonction de modèle lors de l'utilisation du modèle, ou en utilisant decltype(&obj::func). J'ai besoin des arguments args en tant que paramètres de modèle pour être explicite dans le modèle de toute façon.

Je suppose que le compilateur doit connaître explicitement le type de pointeur de fonction, et pas seulement l'objet et certains arguments. Est-ce que je demande trop? Peut etre que je le suis?

+2

Pourquoi vous soucier combien de temps le type de retour est? Nulle part dans le code que vous avez montré avez-vous besoin de l'épeler. Montrez un exemple d'un problème réel que vous pensez devoir résoudre. –

+0

Évidemment, lorsque j'utilise le modèle, je dois spécifier le type de retour. Dans mon scénario, j'ai un 'std :: vector , GetArraySize() >> &' qui ressemble à de la foutaise intégrée dans ce modèle de fonction. Cela n'aide certainement pas à la lisibilité du code. C'est un problème réel. – Matt

+0

Pourquoi pensez-vous avoir besoin de spécifier le type de retour lors de l'utilisation du modèle? En quoi la déduction des paramètres de modèle ne fonctionne-t-elle pas pour vous? Encore une fois, montrez un exemple où vous pensez que vous devez épeler un type long. –

Répondre

0

Ceci est peut-être un doublon de this question.

Les arguments de la fonction ne peuvent pas être fournis via la déduction de paramètres de gabarit, cependant la fonction peut. Une solution simple consiste à réorganiser les arguments de modèle comme suit:

template< typename... args, typename obj, typename ret > 
auto py_wrapped_func(ret (obj::*f)(args...)) 
{ 
    // Do some stuff with the function pointer. 
} 

Maintenant, l'objet et le retour type peut être déduit de l'argument.

Je n'étais pas sûr que cela fonctionnerait avec un argument de modèle variadique sur la gauche. Cependant, il semble compiler bien ...

+0

Le type de retour peut être déduit sans problème, vous n'avez pas besoin de réorganiser quoi que ce soit, le type de retour fait partie de la définition de l'argument –

+0

Oui, car la déduction des paramètres du modèle va de droite à gauche, et les arguments 'args' ne peuvent pas être déduits dans mon scénario, j'ai besoin d'eux comme premier argument. – Matt

+0

La réponse à la question que vous liez indique que "l'ordre des arguments du modèle n'a pas d'importance pour la déduction". – VTT