c++11 boost boost-format

c++11 - C++ 11 equivalente a Boost.Format



boost-format (3)

¿Algo así como Boost.Format en el estándar C ++ 11? He podido evitar usar Boost con una mejor opción de C ++ 11 para cualquier otra necesidad que haya tenido.

Para el caso, Boost.Format no contiene una vela a la sintaxis del format() Python format() . Algo así sería aún mejor.


Hay una propuesta para algo similar al formato boost . Sin embargo, no es parte de C ++ 11 ni C ++ 14, ni se ha agregado nada relacionado con el formato de cadena.

Aquí puedes encontrar la última propuesta. En contraste con el formato boost , se basa en varias plantillas.


Implementación de la función de cadena de formato similar a Python con las expresiones regulares y regex de c ++ 11.

/** Helper code to unpack variadic arguments */ namespace internal { template<typename T> void unpack(std::vector<std::string> &vbuf, T t) { std::stringstream buf; buf << t; vbuf.push_back(buf.str()); } template<typename T, typename ...Args> void unpack(std::vector<std::string> &vbuf, T t, Args &&... args) { std::stringstream buf; buf << t; vbuf.push_back(buf.str()); unpack(vbuf, std::forward<Args>(args)...); } } /** Python-like string formatting */ template<typename ... Args> std::string format(const std::string& fmt, Args ... args) { std::vector<std::string> vbuf; // store arguments as strings std::string in(fmt), out; // unformatted and formatted strings std::regex re_arg("//{//b//d+//b//}"); // search for {0}, {1}, ... std::regex re_idx("//b//d+//b"); // search for 0, 1, ... std::smatch m_arg, m_idx; // store matches size_t idx = 0; // index of argument inside {...} // Unpack arguments and store them in vbuf internal::unpack(vbuf, std::forward<Args>(args)...); // Replace all {x} with vbuf[x] while (std::regex_search(in, m_arg, re_arg)) { out += m_arg.prefix(); if (std::regex_search(m_arg[0].str(), m_idx, re_idx)) { idx = std::stoi(m_idx[0].str()); } if(idx < vbuf.size()) { out += std::regex_replace(m_arg[0].str(), re_arg, vbuf[idx]); } in = m_arg.suffix(); } out += in; return out; }

Ejemplo: cpp.sh/6nli


Según lo indicado correctamente por nosid, ni C ++ 11 ni C ++ 14 proporcionan un equivalente a Boost Format.

Sin embargo, la biblioteca fmt que opcionalmente usa características de C ++ 11 como las plantillas variad proporciona una implementación de la función de format similar a Python:

std::string s = fmt::format("I''d rather be {1} than {0}.", "right", "happy");

y alternativas seguras a las funciones de *printf :

fmt::printf("The answer is %d/n", 42);

Descargo de responsabilidad : soy el autor de esta biblioteca