sentencias para libro instrucciones for español dummies dev curso completo comandos codigos básico avanzado c++ function macros conventions

para - libro de c++ completo



Reescribiendo una macro de c++ como una función, etc. (3)

Tengo una macro que uso mucho, inspirada por otra pregunta:

#define to_string(x) dynamic_cast<ostringstream &> (( ostringstream() << setprecision(4) << dec << x )).str()

Este es extremadamente útil, por ejemplo, en uso con funciones que toman entradas de cadena:

some_function(to_string("The int is " << my_int));

Sin embargo, me han dicho que usar macros en C ++ es una mala práctica, y de hecho he tenido problemas para que lo anterior funcione en diferentes compiladores. ¿Hay alguna manera de escribir esto como otra construcción, por ejemplo, una función, donde tendrá la misma versatilidad?


En C ++ 11 y superior, ahora tenemos std::to_string . Podemos usar eso para convertir los datos en una cadena y anexarla a lo que quieras.

some_function("The int is " + std::to_string(my_int));


Irónicamente, to_string es lo que quieres aquí.

En lugar de: to_string("The int is " << my_int)

Puede escribir: "The int is " + to_string(my_int)

Esto devolverá una string .

[ Ejemplo en vivo ]


Su macro tiene más posibilidades que las ofertas std::to_string . Acepta cualquier secuencia sensible de << operadores, establece una precisión predeterminada y base decimal. Una forma compatible es crear un contenedor std::ostringstream que sea implícitamente convertible a std::string :

class Stringify { public: Stringify() : s() { s << std::setprecision(4) << std::dec; }; template<class T> Stringify& operator<<(T t) { s << t; return *this; } operator std::string() { return s.str(); } private: std::ostringstream s; }; void foo(std::string s) { std::cout << s << std::endl; } int main() { foo(Stringify() << "This is " << 2 << " and " << 3 << " and we can even use manipulators: " << std::setprecision(2) << 3.1234); }

En vivo: http://coliru.stacked-crooked.com/a/14515cabae729875