2010-11-02 3 views
1

je suis en train de construire une fonction de modèle à usage général qui devrait fonctionner avec 2 différents type de structure que je vais écrire un exemplefonctions de modèle, comment envoyer différentes structures et créer une instruction if/else basée sur le type?

struct sa { 
int a; 
int b; 
char d; 
} 
struct sb { 
int a; 
int b; 
int c; 
} 

template < class T> 
void f_print(T & s_passed, bool s_typeB){ 
std::cout << s_passed.a << endl ; 
std::cout << s_passed.b << endl ; 
if(s_typeB == false){ 
std::cout << s_passed.d << endl ; 
}else{ 
std::cout << s_passed.c << endl ; 
} 
} 

puis dans le principal:

{ 
struct sa str_TEST_A ; 
struct sb str_TEST_B ; 

f_print(str_TEST_A,false); 
f_print(str_TEST_B,true); 
} 

maintenant, c'est un court exemple de mon problème où je gère des structures beaucoup plus compliquées, de toute façon ce que je reçois est erreur: 'struct sa' n'a pas de membre nommé 'd'

le problème est que le compilateur gnu C++ n'a pas reconnaître ize que toutes les opérations de la fonction ne sont pas exécutées quand struct sa est passée, et que d est imprimé seulement quand sb est passé, comment je peux résoudre ceci sans créer une fonction dupliquée 1 pour chaque type de structure?

merci :) Francesco

Répondre

4

Vous pouvez déplacer les pièces spécialisées dans des fonctions distinctes et appeler celles-ci à partir du modèle générique:

void f_print_special(sa & s_passed) { 
    std::cout << s_passed.d << endl ; 
} 

void f_print_special(sb & s_passed) { 
    std::cout << s_passed.c << endl ; 
} 

template <class T> 
void f_print(T & s_passed) { 
    std::cout << s_passed.a << endl ; 
    std::cout << s_passed.b << endl ; 
    f_print_special(s_passed); 
} 
+0

Vous avez les deux fonctions avec 'sa &' –

+0

merci c'est pas mal, peut-être je peux arranger quelque chose comme ça pour certaines fonctions et pour d'autres je vais devoir dupliquer;) Merci :) – Francesco

1

Il est non seulement g ++. C'est C++ invalide. Chaque déclaration dans une fonction (template ou non) doit être valide, même si vous pouvez "prouver" qu'elle n'est pas exécutée.

Qu'y a-t-il de mal à leur donner des fonctions séparées? Bien sûr, vous pouvez traiter certaines sous-parties communes en appelant une autre sous-fonction.

Si vous voulez que les fonctions aient le même nom, allez-y et faites-le. La surcharge de fonction va le gérer.

+0

je vous remercie;) je me demandais s'il y avait une façon de faire que je ne sais pas mmm peut-être que je peux faire quelque chose de mieux en utilisant des structures dérivées où sa et sb viennent tous deux d'une autre structure? Je vais jeter un coup d'oeil en profondeur dans ce ... – Francesco

2

sth a la bonne réponse. Cependant, si vous avez besoin d'une solution plus générique, disons que la fonction qui accepte le type sb peut accepter n'importe quel type qui implémente le concept "a C" (ou autre), alors vous devez utiliser envoi basé sur les étiquettes. Je vous suggérerais de le faire parce que, même si je pourrais décrire une situation hypothétique qui pourrait ressembler ou non à votre vrai problème, je ne pourrais pas tous les comprendre.

0

Peut-être est juste un test pour vous dans les modèles d'écriture, mais une mise en œuvre plus naturelle serait d'avoir sa et sb Hériter d'une struct base commune sbase dire, avec les membres a et b seulement, puis ont sa et sb mettre en œuvre leur propre operator<<, en déléguant à la base operator<< pour les parties communes.

Questions connexes