En C++11 et, plus tard, est-il permis de se spécialiser std::to_string dans l'espace de noms std pour les types personnalisés?
Non, vous ne pouvez pas ajouter une surcharge dans l' std
d'espace de noms pour to_string()
.
La bonne nouvelle est que vous n'avez pas besoin d', il existe une solution simple!
Vous pouvez fournir votre propre mise en œuvre et laissez-ADL (argument dépendante de recherche) résoudre le problème pour vous.
Voici comment:
class A {};
std::string to_string(const A&)
{
return "A()";
}
int main()
{
A a;
using std::to_string;
std::cout << to_string(2) << ' ' << to_string(a);
}
Ici nous avons utilisé l' aide de déclaration d'amener std::to_string
dans le champ, et puis nous avons utilisé les non qualifiés appel à l' to_string()
.
Maintenant, les deux std::to_string
et ::to_string
sont visibles et le compilateur détermine la appropriée de surcharge.
Si vous ne voulez pas écrire using std::to_string
avant d'utiliser to_string
chaque fois ou vous avez peur, vous oubliez d'utiliser to_string
sans l'espace de noms, vous pouvez créer une fonction d'assistance
template<typename T>
std::string my_to_string(T&& t)
{
using std::to_string;
return to_string(std::forward<T>(t));
}
Notez que cette fonction peut être défini dans un espace de noms et fonctionne indépendamment de l'espace de noms dans lequel les classes sont définies (ils n'ont pas à être les mêmes).
Voir l' exemple.
REMARQUE: ce fonctionne si vous êtes l'un appelant to_string
. Si il y a une bibliothèque qui appelle std::to_string
et que vous souhaitez modifier votre types que vous êtes hors de la chance.