2011-09-29 3 views
0

Y a-t-il un moyen de faire fonctionner un modèle de classe?Comment faire une méthode de classe universelle?

Ainsi, par exemple

//Warning: this is conceptual pseudo-code 

template<typename TemplateClass, TemplateItem> 
TemplateClass &TemplateClass::operator=(TemplateItem &B) 
{ 
    Item = B.Item; 
    return *this; 
} 

//or... 

template<typename TemplateClass, TemplateItem> 
TemplateClass &TemplateClass::Assignment(TemplateItem &B) 
{ 
    Item = B.Item; 
    return *this; 
} 

Assignment<TestA,TestB>(B); 

Ou quelque chose dans ce sens.

Ce n'est pas seulement pour les affectations, je commenterai.

+5

Peut-être que c'est juste moi, mais je n'ai aucune idée de ce que vous demandez. Quelle est la fonction censée faire? – jalf

+0

Il s'agit essentiellement d'un modèle de méthode qui peut fonctionner pour n'importe quelle classe et prendre n'importe quel élément de modèle. IE Je peux modéliser des opérations d'affectation similaires en un seul appel plutôt que de dupliquer de nombreuses lignes de code pour des sous-classes avec des retours de classe différents. – SSight3

+1

dans ce cas, juste en faire une fonction non-membre? – jalf

Répondre

1

Je suis sûr que je vais me défoncé par le « préprocesseur est mal » groupe, mais je pense que vous cherchez quelque chose comme ceci:

#define DEFINE_ASSIGNMENT(mainClass,memberClass,member)  \ 
mainClass & mainClass::operator = (const memberClass & rhs) \ 
{                \ 
    member=rhs.member;           \ 
    return *this;            \ 
} 

DEFINIE_ASSIGNMENT(TestA,TestB,Item) 
+0

C'est une excellente idée. Je l'aime bien, et oui c'est le genre de chose que je suis après. Upvote pour l'ingéniosité. J'espérais une méthode de modèle afin que l'héritage puisse se produire, mais à défaut (si personne ne peut offrir une méthode viable), je vais sélectionner ceci. Je reçois trop de code en double (mais je ne peux pas utiliser la valeur par défaut ou l'héritage en raison de problèmes de retour). – SSight3

+0

Pourriez-vous me dire ce que le '\' fait? Je vous remercie. – SSight3

+1

@ SSight3 Terminer une ligne avec '' \ '' est le caractère de continuation de ligne. Normalement, les directives '# define' s'arrêtent à la fin de la ligne, le' '\' 'indique au préprocesseur de continuer. Ils peuvent également être utilisés pour étendre les commentaires '//' d'une seule ligne, mais plusieurs compilateurs préviendront de les utiliser comme ça. Le '' \ '' doit être à la fin de la ligne, il ne peut plus avoir d'espace après. – IronMensan

1

Vous ne pouvez pas ajouter quelque chose dans la définition d'une classe. Vous ne pouvez pas forcer une classe à avoir une fonction membre particulière. Une fois que vous avez mis le ; sur une définition de classe, il a été défini et il ne peut pas être modifié. Donc, si vous voulez avoir un membre d'une classe, il doit être déclaré au sein de la définition de la classe.

Maintenant, la façon générale d'étendre les fonctionnalités comme celui-ci est d'utiliser une fonction non-membre:

template<typename ClassName, typename Other> 
ClassName &SomeFunc(ClassName &myType, const Other &theOther); 

Cette fonction retournerait myType. De toute évidence, cela ne va pas aider les opérateurs qui doivent être membres d'une classe, comme l'affectation. Mais il n'y a rien que vous puissiez faire à ce sujet. Tout ce que vous pouvez faire de plus, c'est que l'opérateur d'affectation appelle la fonction non-membre, donc tout le travail se poursuit là-dedans.

Mais c'est ce que vous pouvez faire de mieux.

Questions connexes