1
votes

Comment puis-je simplifier le spécificateur de nom imbriqué en C ++?

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 :: B :: C :: mais utilisez plutôt quelque chose comme aShortAlias ​​ :: foo () . Est-ce possible avec C ++?

Apparemment, utiliser avec aShrtAlias ​​ = typename A :: B :: C 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 commentaires

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 () .


3 Réponses :


1
votes

Utilisez simplement en utilisant :

template <bool T>
using aShortAlias = A<T>::B::C


2 commentaires

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.



1
votes

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.


3 commentaires

À 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.



0
votes

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() {
}


2 commentaires

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.