Envoyé par
B65AcR
Le code ci dessous ne compile pas et j'ignore pourquoi.
1 2 3 4 5
| template <class maClasse>
maClasse TestRetour()
{
return 1;
} |
Ça ne compile pas parce qu'un int (1) n'est pas convertible en "maClasse".
Envoyé par
B65AcR
il ne se sert même pas du destructeur d’ailleurs. Pourquoi?
maClasse *C = new maClasse;
Le destructeur sera appelé lors d'un delete C;.
(Attention aux fuites mémoire)
Envoyé par
B65AcR
J'ai besoin d'une fonction qui laisse le choix à l'utilisateur de créer une variable de type maClasse, et dans ce cas la renvoie par un return, ou si l'utilisateur en decide autrement, la fonction renvoie un int.
J'ai pas l'impression que les templates soient utiles pour ça
1 2 3 4 5 6 7
| maClasse testRetour(const maClasse& arg) const {
return arg; // copie ici, je me demande si dans ce cas particulier retourner une ref constante est safe.
}
int testRetour() const {
return 1;
} |
Tu as au final 2 fonctions bien distinctes : 1 qui prend un "maClasse en argument et 1 qui ne prend pas d'argument.
Ou peut être que tu cherches à faire quelque chose comme
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| template <class T>
T createOrReturnInt() const;
template <>
int createOrReturnInt<int>() const {
return 1;
}
template <>
maClasse createOrReturnInt<maClasse>() const {
return maClasse();
}
// niveau utilisation
maClasse a;
auto b = a.createOrReturnInt<int>(); // b de type int
auto c = a.createOrReturnInt<maClasse>(); // c de type maClasse
auto d = a.createOrReturnInt<float>(); // erreur de link |
Mais j'ai du mal à voir l'intéret d'une telle fonction.
En créant la fonction différemment on peut arriver à quelque chose du genre
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class maClasse {
public:
int a;
maClasse(): a(555) { std::cout << "constructeur\n"; }
~maClasse() { std::cout << "destructeur\n"; }
template <bool>
struct createOrReturnInt {
static int exec() { return 1; }
};
template <>
struct createOrReturnInt<true> {
static maClasse exec() { return maClasse(); }
};
};
// utilisation
auto a = maClasse::createOrReturnInt<true>::exec(); // a de type maClasse
auto b = maClasse::createOrReturnInt<false>::exec(); // b de type int |
C'est peut être ce que tu cherches à faire ?
Partager