C ++开启数据类型

时间:2014-08-18 02:38:34

标签: c++ enums boost-variant boost-any

我有一个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)));

1 个答案:

答案 0 :(得分:0)

嗯,不幸的是答案是否定的。正如R Sahu在评论中所说:

  

不是你想要的方式。如果get_value是一个函数模板,你可以   仅当attribute.type是已知的时才使用get_value   编译时的积分常数。