Création d’un nouveau type de primitive

Existe-t-il un moyen de créer un nouveau type qui ressemble à l’un des types de base (par exemple, char), et qui peut être implicitement converti entre, mais qui se résoudra différemment dans les modèles, de telle sorte que, par exemple, le code suivant fonctionne?

typedef char utf8; templatevoid f(T c); template void f(char c) { std::cout << "ascii " << c << std::endl; } template void f(utf8 c)//error C2766: explicit specialization; 'void f(char)' has already been defined { std::cout << "utf8 " << c << std::endl; } int main() { char c1 = 'x'; utf8 c2 = 'g'; f(c1); f(c2); } 

Je pense que cela peut être possible avec une classe contenant un seul membre de données, le cas échéant, quel est le moyen le plus propre de le faire, et que les compilateurs pourront l’optimiser comme s’il s’agissait d’une primitive.

EDIT: J’ai essayé BOOST_STRONG_TYPEDEF, et cela semble fonctionner pour des choses de base, mais comment puis-je ensuite créer un std :: basic_ssortingng à partir du nouveau type?

 BOOST_STRONG_TYPEDEF(char,utf8); //first try BOOST_STRONG_TYPEDEF(std::ssortingng,utf8_ssortingng); //second try typedef std::basic_ssortingng<utf8, std::char_traits,std::allocator > uft8_ssortingng; 

Le premier ne fonctionne pas vraiment parce que le type résultant attend toujours le caractère pour toutes ses méthodes, et le second ne semble pas aimer la présence de constructeurs et d’opérateurs d’assignation 🙁

Je n’ai pas encore essayé l’autre façon de créer le nouveau type de caractère. Pourra-t-il contourner ce problème si je ne peux pas utiliser BOOST_STRONG_TYPEDEF?

J’ai entendu une rumeur selon laquelle C ++ 0x apporterait des typedefs solides qui permettraient à la classe utf8 de se distinguer de votre caractère, mais cela n’existe pas actuellement. Peut-être que le typedef de Boost pourrait aider, mais je ne sais pas.

Matthew Wilson, auteur de C ++, appelle ce que vous décrivez «de véritables typedefs». Ils sont implémentés en tant que classe contenant un seul membre de données (comme vous l’avez dit). Il les décrit et fournit un modèle d’implémentation au chapitre 18 d’ Imperfect C ++ (bon livre, en passant) et dans cet article du Dr. Dobb’s Journal .

En ce qui concerne l’optimisation, tout bon compilateur devrait pouvoir l’optimiser en tant que primitive (car de grandes parties de la STL, par exemple, reposent sur des optimisations de bonne qualité comme celle-ci), mais je n’ai pas de détails.

Le problème ici est que typedef ne définit pas vraiment de nouveaux types (comme par exemple Ada, où vous pouvez définir des types entiers incompatibles entre eux), mais simplement des alias pour des existants.

Je crois qu’une des propositions pour la prochaine version de C ++ inclura les types appropriés.