我有一个Attribute
类,其中包含一个Enum,用于指定属性的类型(INT_64, UINT 64, INT_32, STRING, DOUBLE, etc.
)。此Attribute类使用boost :: any来保存由枚举指定的类型的向量。
目前为了处理这些数据,我有一个很大的开关语句,至少对于基本数据类型,我觉得有一种更简单的方法。
我的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)));
答案 0 :(得分:0)
嗯,不幸的是答案是否定的。正如R Sahu在评论中所说:
不是你想要的方式。如果get_value是一个函数模板,你可以 仅当attribute.type是已知的时才使用get_value 编译时的积分常数。