Effectivement, en mettant tout le code dans le header, ça marche… mais ce n'est pas très propre…
J'ai du mal à voir en quoi mettre des macro dans les headers est "propre" alors que mettre un métaprogramme template dans les headers n'est "pas très propre". Les deux sont de la métaprogrammation. Ce n'est pas parce que l'un ressemble à une implémentation que ça en est une.
Sinon, std::string n'hérite pas de std::basic_string. std::string est exactement std::basic_string<char>. Il n'y a pas de lien d'héritage entre un patron et son instanciation. En fait, il n'y a pas de lien du tout. On peut très bien avoir un patron:
template<typenameA>classB{voidcoucou();};
et décider que B<int> est totalement différent…
template<>classB<int>:std::runtime_error{private:voidcocu();public:B(floati);constchar*what()const;// noexcept en C++11protected:doublequarante_deux;};
(ce n'est pas le cas de std::basic_string<char>sur les bonnes implémentations, mais ça pourrai).
Pour cette raison, si tu veut à la fois supporter les std::string et std::u32string, tu n'a pas vraiment le choix que d'utiliser un template. (bon, ok, tu peux utiliser boost::variant ou boost::any, mais c'est franchement se tirer une balle dans le pied).
[^] # Re: Templates et C++03
Posté par Batchyx . En réponse au message Problème de templates: undefined reference. Évalué à 1.
J'ai du mal à voir en quoi mettre des macro dans les headers est "propre" alors que mettre un métaprogramme template dans les headers n'est "pas très propre". Les deux sont de la métaprogrammation. Ce n'est pas parce que l'un ressemble à une implémentation que ça en est une.
Sinon,
std::stringn'hérite pas destd::basic_string.std::stringest exactementstd::basic_string<char>. Il n'y a pas de lien d'héritage entre un patron et son instanciation. En fait, il n'y a pas de lien du tout. On peut très bien avoir un patron:et décider que
B<int>est totalement différent…(ce n'est pas le cas de
std::basic_string<char>sur les bonnes implémentations, mais ça pourrai).Pour cette raison, si tu veut à la fois supporter les
std::stringetstd::u32string, tu n'a pas vraiment le choix que d'utiliser un template. (bon, ok, tu peux utiliserboost::variantouboost::any, mais c'est franchement se tirer une balle dans le pied).