2

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)));
4

1 に答える 1

0

残念ながら、答えはノーです。コメントでR Sahuが言ったように:

あなたが望む方法ではありません。get_value が関数テンプレートの場合、attribute.type がコンパイル時に既知の整数定数である場合にのみ、get_value を使用できます。

于 2015-07-06T12:03:35.897 に答える