Я читаю тип объекта из файла:
enum class type_index { ... };
type_index typeidx = read(file_handle, type_index{});
В зависимости от индекса типа я хочу создать тип (из списка возможных типов) и сделать с ним что-то общее (тот же общий код для каждого типа):
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
});
То есть:
- У меня есть тот же общий код для разных типов,
- Я хочу, чтобы компилятор генерировал конкретный код для каждого типа,
- Я знаю только, какой тип мне нужен во время выполнения, и
- Я хочу выполнить только код для этого единственного типа.
Это выглядит как оператор switch
с условием выполнения, но где "случаи" генерируются во время компиляции. В частности, это вообще не похоже на инструкцию for_each
(я ничего не делаю для всех элементов в векторе, кортеже, списке, но только для одного элемента).
Есть ли более четкий способ выразить/написать эту идиому? (Например, используйте mpl::vector
вместо std::tuple
для возможных типов, используйте нечто, отличное от алгоритма for_each
,...)