у меня есть Attribute
класс, который имеет Enum, определяющий тип атрибута (INT_64, UINT 64, INT_32, STRING, DOUBLE, etc.
). Этот класс Attribute использует boost :: any для хранения вектора типов, указанных в enum.
На данный момент для работы с этими данными у меня есть большой оператор switch, и, по крайней мере, для базовых типов данных я чувствую, что был бы более простой способ сделать это.
Мой оператор switch выглядит примерно так:
switch(attribute.type) {
case DOUBLE:
stmt->setNumber(col_counter, Number(attribute.get_value<double>(row_counter)));
break;
case INT_32:
stmt->setNumber(col_counter, Number(attribute.get_value<int_32t>(row_counter)));
break;
}
Атрибут определяется как:
class Attribute
{
public:
template <typename T>
T get_value(const unsigned index) const
{
const std::vector<T> * v = boost::any_cast<const std::vector<T> >(&data);
return v->at(index);
}
Data_Type_Enum type;
std::string name;
boost::any data;
}
Есть ли способ избежать оператора switch, делая что-то похожее на:
stmt->setNumber(col_counter, Number(attribute.get_value<attribute.type>(row_counter)));
Ну, к сожалению, ответ — нет. Как сказал Р. Саху в комментарии:
Не так, как вы хотите. Если get_value является шаблоном функции, вы можете
используйте get_value, только если attribute.type является известным
интегральная константа во время компиляции.