Field
のみがタイプではなく、Field<int>
およびField<double>
のようなタイプのファミリーを生成することができるテンプレートである。これらのフィールドはすべて、関連するものではなく、他のフィールドから何らかの形で導出されます。したがって、これらの生成されたすべての型の間に何らかの関係を確立する必要があります。 1つの方法は、共通のテンプレート以外の基本クラスを使用することです:
class FieldBase { };
template <typename T>
class Field : public FieldBase {
private:
T value;
DataType<T> type;
};
class Row {
private:
std::map<unsigned long,FieldBase*> column;
};
コード内にその生ポインタの代わりにスマートポインタを使用することを検討してください。とにかく、問題は型情報が失われていることです - Field<double>
またはField<int>
を指しているかどうかはもはや知られておらず、テンプレートで設定されたベースに何らかの種類のフラグを保持することによってしか検出できませんまたはRTTIを使用して質問することにより、RTTIを要求します。
dynamic_cast<Field<int>*>(field) != 0
しかし、それは醜いです。特にあなたが望むのは価値の意味であるからです。私はあなたの行をコピーすることができるようにすると、それはその中のすべてのフィールドをコピーします。また、RTTIを使用して派生型にハックすることなく、ダブルが格納されているときに倍精度浮動小数点型を取得したい場合があります。
これを行う1つの方法は、識別されたユニオンを使用することです。これは、基本的には、任意の型の共用体であり、さらに、そのフィールドに現在格納されている値(たとえば、double型、int型など)を格納する型フラグです。例:
template <typename T>
class Field {
private:
T value;
DataType<T> type;
};
class Row {
private:
std::map<unsigned long,
boost::variant< Field<int>, Field<double> > >
column;
};
boost :: variantはすべてあなたのために働きます。訪問を使用して、適切なオーバーロードを使用してFunctorを呼び出すことができます。それを見てmanual
何が問題なのですか? –
あなたのコードをhtmlに変換する必要はありません。ちょうどそれを4文字の字下げで置きます。 –
to Dave:私の質問です:Fieldはテンプレート化されているので、どのように値が「あらゆる種類のフィールド」であることをstd :: mapに "伝える"ことができますか? to litb:お寄せいただきありがとうございます! :-) – jbatista