Al desarrollar una aplicación, tuve el siguiente problema. Quería devolver un std::list<string>
vacío cuando un puntero de función determinado era nulo, o el resultado de esa función en caso contrario. Esta es una versión simplificada de mi código:Ternary operator + C++ 11 constructor from initializer_list
typedef std::list<std::string> (*ParamGenerator)();
std::list<std::string> foo() {
/* ... */
ParamGenerator generator = ...;
if(generator)
return generator();
else
return {};
}
Sin embargo, normalmente me gusta usar el ternario (?:
) del operador en estos casos, así que traté de usarlo de esta manera (como es habitual):
return generator ? generator() : {};
Pero consiguió este error:
somefile.cpp:143:46: error: expected primary-expression before ‘{’ token
somefile.cpp:143:46: error: expected ‘;’ before ‘{’ token
¿esto significa que no puede utilizar el operador ternario para devolver los objetos creados utilizando su constructor de una initializer_list
? ¿Hay alguna razón en particular para eso?
Mi consejo sería: ** no hagas esto en absoluto **. Conviértalo en un algoritmo genérico que toma un iterador (cuyo tipo es un parámetro de plantilla), de modo que cuando se da cuenta de que 'std :: list' era una mala elección, puede cambiar a otra cosa de forma relativamente sencilla. –
@JerryCoffin Probablemente tomaré ese consejo;). Me gustaría saber si es posible de todos modos (o por qué no es así, no se puede hacer). – mfontanini
De acuerdo, es suficiente. Es una pregunta interesante (por la que he votado) aunque creo que la aplicación exacta probablemente no sea la mejor. –