OVH Cloud OVH Cloud

Comment écrire to_string? (long)

2 réponses
Avatar
SerGioGio
Bonjour,

Je cherche a écrire une fonction to_string semblable à boost::lexical_cast
mais
1)dans un seul sens (T -> std::string) et 2)permettant d'utiliser des
manipulateurs (std::hex / std::showbase / etc.). J'ai fait plusieurs essais,
et
j'aimerais avoir votre opinion générale sur chacun d'eux (d'un point de vue
pratique, à l'utilisation) et si il y a de meilleures solutions?

Merci d'avance pour vos commentaires et suggestions.

SerGioGioGio


**** solution1
| #define to_string(expr) \
| std::string( \
| static_cast<std::ostringstream&>(std::ostringstream().flush() << expr \
| ).str().c_str())

pour l'utiliser:
| std::cout << to_string(std::hex << std::showbase << 10);

problèmes:
- c'est une macro
- ça plantera dès que quelqu'un dira (à cause de la virgule):
| std::cout << to_string( toto<1, 2>(10) );


**** solution2
| template <class T>
| std::string to_string(const T& a_t, std::ostream& a_stream = fmt())
| {
| a_stream << a_t;
| return static_cast<std::ostringstream&>(a_stream).str();
| }

pour l'utiliser:
| std::cout << to_string(10, fmt() << std::hex << std::showbase);

problèmes:
- c'est lourd à écrire

**** solution3
| struct to_string : public std::string
| {
| std::stringstream stream;
| template<class T> to_string(const T& a_t)
| {
| (*this)(a_t);
| }
| template<class T> to_string(T& a_t)
| {
| (*this)(a_t);
| }
| template<class T> to_string& operator() (const T& a_t)
| {
| stream << a_t;
| append(
| std::istreambuf_iterator<char>(stream.rdbuf()),
| std::istreambuf_iterator<char>());
| return *this;
| }
| template<class T> to_string& operator() (T& a_t)
| {
| stream << a_t;
| append(
| std::istreambuf_iterator<char>(stream.rdbuf()),
| std::istreambuf_iterator<char>());
| return *this;
| }
| };

pour l'utiliser:
| std::cout << to_string(std::hex)(std::showbase)(10);

problèmes:
- la ligne suivante est prise pour une définition de std::hex!!
| to_string(std::hex);

remarque:
- A t'on vraiment besoin des versions non-const dans ce cas là? VC7 ne
compile pas to_string(std::hex) sans les version non-const, alors que Comeau
online oui.

2 réponses

Avatar
kanze
SerGioGio wrote:

Je cherche a écrire une fonction to_string semblable à
boost::lexical_cast mais
1)dans un seul sens (T -> std::string) et 2)permettant d'utiliser des
manipulateurs (std::hex / std::showbase / etc.).


Il existe une classe qui fait ça déjà dans la norme. Elle
s'appelle std::ostringstream. Elle est aussi beaucoup plus
souple à l'utilisation que tu ne pourrais faire avec une seule
fonction.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Pierre THIERRY
Le Thu, 19 May 2005 05:23:52 +0200, SerGioGio a écrit :
Je cherche a écrire une fonction to_string [...] permettant d'utiliser
des manipulateurs


Si l'utilisation d'un stringstream ne te convient pas, tu pourrais
écrire un foncteur ; dans ce cas, c'est la solution la plus évidente. Tu
lui surcharges l'opérateur de décalage pour le type fmtflags et
l'opérateur () pour ton type T.

Brièvement,
Nowhere man
--

OpenPGP 0xD9D50D8A