Supposons que j'ai le code suivant:
template<bool t> class A{ class B{ class C{ public: void foo(); }; }; }; template<bool t> void A<t>::B::C::foo() { // some code }
lors de l'écriture de la définition de cette fonction foo ()
, je souhaite éviter d'écrire le nom imbriqué trop long spécificateur A
mais utilisez plutôt quelque chose comme aShortAlias
. Est-ce possible avec C ++?
Apparemment, utiliser avec aShrtAlias
ne fonctionne pas. Et je ne veux pas vraiment utiliser un #define
comme solution de contournement car il ne fait que remplacer du texte (peut-être qu'il y a une justification pour #define
ici?).
3 Réponses :
Utilisez simplement en utilisant
:
template <bool T> using aShortAlias = A<T>::B::C
Cependant, il ne vous permet pas de définir la fonction membre et typename
est probablement requis.
Cela ne permet pas de définir la fonction membre. Même avec un typename
. Parce que ce aShortAlias
n'est pas réellement un type.
Bien que vous puissiez créer un alias:
template<bool T> void X<T>::foo() // not allowed; doesn't compile { ... }
Vous ne pouvez pas utiliser cet alias comme spécificateur dans la déclaration:
template<bool T> using X = typename A<T>::B::C;
Afaik you doivent utiliser le nom complet dans la déclaration.
À l'édition remplaçant "déclaration" par "définition": Une définition est toujours une déclaration aussi. Et l'alias ne peut pas être utilisé comme spécificateur dans la partie déclaration de la définition si vous voulez. Vous pouvez parfaitement l'utiliser dans le corps de la définition, ou comme type de paramètre, etc.
@uneven_mark pas de soucis. Je ne suis pas sûr à 100% que la terminologie que j'ai utilisée soit correcte.
Techniquement, en passant par la norme, je suppose que c'est le déclarateur de la définition de fonction , cette dernière étant aussi une déclaration , bien que le corps de fonction semble faire partie de la déclaration et de la définition de la fonction , si je lis correctement la grammaire. En tout cas, je comprends ce que vous vouliez dire maintenant.
Je pense que le mieux que vous puissiez faire est:
template <bool T> using aShortAlias = typename A<T>::B::C; template<> void aShortAlias<false>::foo() { } template<> void aShortAlias<true>::foo() { }
et si vous avez autre chose que bool
?
Ah je vois votre point! Heureusement, je n'ai rien d'autre que bool
pour le moment. Si les variables de modèle sont plus générales (par exemple int
), cette approche ne fonctionne pas vraiment.
template class A {class B {class C {private: void foo () {/ * some code here * /}}; }; };
- aussi -foo ()
ne peut être appelé que sur l'instance de C, comment allez-vous faire ça :)Je peux toujours ajouter plus de contenu pour que tout ait du sens, n'est-ce pas?
Dans l'état actuel des choses, je pense qu'il n'y a aucun moyen légal d'appeler
foo ()
.