template<class Msg, class... Args>
std::wstring descf(Msg, Args&&... args) {
std::wostringstream woss;
owss << Msg << ". " << ... << " " << args << ": '" << args << "' ";//not legal at all
//or
owss << Msg << ". " << args[0] << ": '" << args[1] << "' " << args[2] << ": '" << args[3] << "' "; //... pseudo code, and so on...
}
Sé que puedo usar una lista de pares o algo así en su lugar, pero estoy interesado en cómo hacer esto mientras mantengo la sintaxis de la función para:
const auto formatted = descf(L"message", "arg1", arg1, "arg2", arg2);
bool
aint
al indexar, así que fui con un realint
para alternar el estado. Y el prefijo anterior al posterior++
requiere ciclos mentales adicionales para verificar (al menos para mí), mientras que el separado1 -
no se puede leer mal. En resumen, traté de mantener esto lo más legible posible, pero esto, por supuesto, depende del gusto personal (o de la guía de estilo correspondiente). max66 lo condensó mucho más.std::array
matriz en lugar de una matriz nativa parece una complicación inútil.std::array<const char*, 2>
infinitamente más legible queconst char**
. Pero, una vez más, esta es mi mejor oportunidad de legibilidad en torno a una sintaxis bastante oscura, puedes hacer lo que quieras en tu propio código. Todo lo que puedo hacer es darle el punto de datos de lo que considero legible.Esto es fácil con un par de funciones auxiliares que siguen el siguiente patrón.
Esta no es una expresión de pliegue, pero el resultado neto es el mismo.
fuente
Supongo que puedes probar con un índice y un operador ternario.
Algo como sigue
fuente
std::array
(que, de todos modos, es una clase ligera) pero (así que creo que es preferible la respuesta aceptada) es menos legible.El siguiente código debería hacer el truco. El paquete de parámetros se expande en una lista de inicializador.
fuente
args
sea convertible astd::string
s.Con
std::index_sequence
:Manifestación
fuente