creo que muchos de ustedes tienen este tipo de código en algún lugar:Usando C++ funciones lambda durante la inicialización variable de
int foo;
switch (bar) {
case SOMETHING: foo = 5; break;
case STHNELSE: foo = 10; break;
...
}
Pero este código tiene algunos inconvenientes:
- usted puede olvidarse fácilmente una "ruptura"
foo
La variable no está const mientras que debería ser- es que no es bella
Así que empezaron a preguntarse si había una manera de "mejorar" este tipo de código, y tengo esta pequeña idea:
const int foo = [&]() -> int {
switch (bar) {
case SOMETHING: return 5;
case STHNELSE: return 10;
...
}
}();
Nota: el primer par de paréntesis que no es obligatorio, pero MSVC++ no es compatible aún
Puede utilizar el mismo truco con if-else donde el operador ternario sería demasiado complicado, las variables que requieren pasar por punteros para inicializarse (como para funciones de DirectX), etc.
Mi las preguntas son:
- ¿Hay algún problema con este código que no haya visto?
- ¿Le parece mejor que la anterior?
- g ++ parece alinear la función, pero ¿cree que todos los compiladores lo harán?
EDIT: esto es lo que quiero decir con "funciones de DirectX"
_xAudio2 = [&]() -> std::shared_ptr<IXAudio2> {
IXAudio2* ptr = nullptr;
if (FAILED(XAudio2Create(&ptr, xAudioFlags, XAUDIO2_DEFAULT_PROCESSOR)))
throw std::runtime_error("XAudio2Create failed");
return std::shared_ptr<IXAudio2>(ptr, [](IUnknown* ptr) { ptr->Release(); });
}();
¡Truco limpio! Pero iría un paso más allá y convertiría la lambda en una función llamada "int EnumToFoo (Enum)" de todos modos: menos desorden en la función de llamada y automáticamente documentado con un nombre bien descriptivo;). – Sjoerd
Estoy con sjoerd - Siempre refactorizaría cualquier función de mapeo - cambiaría o de otra manera – StuartLC
En este caso podría valer la pena codificar una función externa, pero no me veo creando una función solo para construir un objeto DirectX por ejemplo – Tomaka17