Je tente actuellement de mettre en œuvre une fonction toString
qui appelle .toString()
ou std::to_string()
en fonction de ce qui est disponible pour le type déduitSFINAE fallback lorsqu'une fonction n'existe pas
Jusqu'à présent, je cet extrait de travail:
#include <iostream>
#include <string>
template <class T>
auto toString(const T& obj)
-> decltype(obj.toString(), std::string())
{
return obj.toString();
}
template <class T>
auto toString(const T& obj)
-> decltype(std::to_string(obj), std::string())
{
return std::to_string(obj);
}
template <class T>
auto toString(const T& obj)
-> decltype(std::string(obj))
{
return std::string(obj);
}
class Foo{
public:
std::string toString() const {
return "Hello";
}
};
int main()
{
Foo bar;
std::cout << toString(bar);
std::cout << toString(5);
std::cout << toString("Hello const char*");
}
Maintenant, je veux insérer un static_assert
lorsqu'aucune surcharge de ce qui précède n'est viable, car le message d'erreur GCC par défaut pour les anciennes versions de GCC n'est pas très instructif.
Comment puis-je vérifier si .toString()
ou std::to_string()
sont possibles pour T
?
Jusqu'ici je n'ai trouvé aucun moyen de vérifier si quelque chose est pas présent, seulement l'inverse. J'espère que quelqu'un a une idée de comment résoudre ceci et merci pour votre temps.
'decltype (std :: to_string (obj), std :: string()) - TIL. Mais vous devriez "annuler" la première expression. Un opérateur virgule surchargé d'un utilisateur méchant peut gâcher votre SFINAE – StoryTeller
@ max66 - Pas besoin de vous répéter. Et la version OP fonctionnera avec tout ce qui est convertible en un 'std :: string' tout en fixant le type de retour de la fonction. Plutot malin. – StoryTeller
@StoryTeller - vous avez raison. – max66