Interruptor de tiempo de ejecución Boost.Fusion
Estoy leyendo el tipo de un objeto de un archivo:
enum class type_index { ... };
type_index typeidx = read(file_handle, type_index{});
Dependiendo del índice de tipo, quiero crear un tipo (de una lista de tipos posibles) y hacer algo genérico con él (el mismo código genérico para cada tipo):
std::tuple<type1, type2, ..., typeN> possible_types;
boost::fusion::for_each(possible_types, [&](auto i) {
if (i::typeidx != typeidx) { return; }
// do generic stuff with i
});
Es decir:
Tengo el mismo código genérico para diferentes tipos,Quiero que el compilador genere código específico para cada tipo,Solo sé qué tipo necesito en tiempo de ejecución, yQuiero ejecutar el código solo para ese tipo único.Esto se siente como unswitch
declaración con una condición de tiempo de ejecución, pero donde los "casos" se generan en tiempo de compilación. En particular, esto no se siente como unfor_each
declaración en absoluto (no estoy haciendo nada para todos los elementos en un vector, tupla, lista, sino solo para un solo elemento).
¿Hay una manera mejor y más clara de expresar / escribir este idioma? (Por ejemplo, use unmpl::vector
en vez de unastd::tuple
para los tipos posibles, use algo diferente alfor_each
algoritmo,...)