7
votes

Comment réduire les arguments du modèle?

Ici, j'ai le fonctionnement du type suivant:

// that is what I tried, but it could not deduce T and Foo
template<T Foo::*p, class T, class Foo>
X<T, Foo, T Foo::*p> createx()
{
    return X<T, Foo, p>();
}

// this works, but requires to write T and Foo explicitly
template<class T, class Foo, T Foo::*p>
X<T, Foo, T Foo::*p> createx()
{
    return X<T, Foo, p>();
}


1 commentaires

Petite solution (votre code "correct" ne compile pas): Votre déclaration de retour de CreateEx doit contenir p en tant que paramètre de modèle troisième modèle, pas T FOO: : * p . Ne change cependant pas le problème.


3 Réponses :


8
votes

Je ne conserverai tout simplement pas le pointeur de membre comme un argument de modèle:

std::for_each(cont.begin(), cont.end(), CREATE_X(&FF::r) );


3 commentaires

La question était de savoir comment écrire créex . J'ai déjà une solution de compilation de compilation et je veux juste réduire les arguments du modèle.


Maintenant c'est presque dont j'ai besoin. J'accepterais cette réponse mais je n'aime pas les macros.


Je pense que ce fil est similaire: Stackoverflow.com/Questtions/1447141/...



1
votes

Je ne pense pas qu'il soit possible de réduire le nombre d'arguments de modèle que vous devez spécifier si vous souhaitez qu'un pointeur de fonction de membre arbitrataire soit un argument de modèle.

au lieu des pointeurs de fonction membre, vous pouvez utiliser un paramètre de type normal. Pour un foncteur qui extrait une référence: xxx

Ensuite, vous avez toujours la possibilité d'utiliser un fonctionnement spécial qui accède directement à un certain membre (si vous pensez que cela fournit une meilleure performance) ou utilisez un fonctionnaire accessoir plus général qui le fait avec un pointeur de fonction membre en tant que membre.


5 commentaires

Il est autorisé par standard d'avoir un pointeur de fonction membre comme argument de modèle.


Ouais je sais. Le "je ne pense pas qu'il soit possible" fait référence au titre de la question. Je n'ai pas dit "Les pointeurs de la fonction membre ne sont pas autorisés comme paramètres de modèle". S'il vous plaît lire des réponses plus attentivement avant de basculer. Je vais essayer de faire de mon mieux la prochaine fois pour écrire des réponses qui ne peuvent pas être mal comprises. Merci.


Cette réponse n'a rien à voir avec ma question.


@sellibitze. Quoi qu'il en soit, votre code nécessite un typename lorsqu'un pointeur sur la fonction de membre est une constante. Vous devriez fournir un exemple comment vous supposez l'utiliser.


@Alexey: Je suis désolé de le penser. @Kirill: J'ai du mal à relier votre dernier commentaire à ma réponse. Il semble que nous avons un problème de communication.



1
votes

J'aurais une question: Avez-vous vraiment besoin de spécifier tous ces arguments? XXX

Ceci fonctionne, il n'y a pas besoin d'un supplémentaire méthode Fonctionne juste: xxx

Je préfère ne pas être trop générique lorsque je crée des modèles.

Si vous devez avoir un opérateur plus complexe ( ) , vous pouvez toujours faire un peu de soulever lourd à l'intérieur.

En outre, vous pouvez envisager boost.bind , si vous souhaitez vraiment extraire les fonctions du pointeur et les références à Attributs.

EDIT :

J'ai une idée, qui sera un peu différent et n'implique aucune magie macro, ni même une magie de métaprogramming.

Pourquoi ne pas simplement utiliser un typlef et être fait avec elle?

ok, peut ne pas être aussi automatisé que vous le souhaitez ... mais vous n'avez que Pour taper cela une fois, après tout. xxx

semble moins de dactylographie que xxx

répété sur et plus.

J'utilise à peine des modèles nus dans mon code, je préfère les typez-les pour améliorer lectuabili ty.


2 commentaires

Ce n'est pas une option. struct xr Utilisez .r -Member. Si je veux utiliser un membre .m dois-je définir un nouveau struct XM ? Et qu'en est-il des autres membres?


Une structure par membre, rien de fantaisie, juste quelque chose qui fonctionne et est simple. Bien sûr, dans votre exemple, vous avez présenté une structure avec 2 attributs et je pense que cela échoue assez bien à 4 ou 5 ...