2

L'exemple suivant illustre ma question:Nom problème de recherche dans le type de fuite de retour

#include <iostream> 
#include <string> 

template <typename T> 
auto func(const T& x) -> decltype(to_string(x)) { 
    using std::to_string; 
    return to_string(x); 
} 

int main() { 
    std::cout << func(1); 
} 

Je ne veux pas importer std::to_string dans l'espace de noms global, pas ce que je veux utiliser -> decltype(std::to_string(x)) comme faisant cela désactive ADL. Évidemment, vous ne pouvez pas mettre using std::to_string au sein de decltype. Alors, comment dois-je faire?

+2

Vous avez C++ 14 dans les balises. Si vous utilisez C++ 14, vous n'avez pas besoin du type de retour final. Laissez simplement 'auto'. –

+2

@Revolver_Ocelot Cela désactivera SFINAE, et si SFINAE n'est pas nécessaire, (dans ce cas précis) on peut simplement utiliser 'std :: string' comme type de retour. – cpplearner

Répondre

6

Déférer à un autre espace de noms; Ceci permet à l'ADL de toujours être fait, mais ne pollue pas votre espace de noms global. Ayant rencontré ce problème quelques fois avec quelques fonctions et ADL connexes, j'ai trouvé l'espace de noms différé (bien nommé) est des alternatives appropriées.