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?
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. –
É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
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. –