1

独自のシーケンスクラスを実装するためにFusionシーケンスから継承できますか/すべきですか?いいえの場合、なぜですか?

例えば:

typedef boost::fusion::vector<
    std::vector<const char*>, 
    int, 
    double > MyVector;

class MyVectorWithData : public MyVector
{
public:
    MyVectorWithData(int i); // Constructor does some initialization
    // may be other member functions acting on baseclass MyVector
};
4

1 に答える 1

1

標準コンテナと同様に、Fusion コンテナは仮想デストラクタを提供しないため、それらを拡張することに対する同じ議論が成り立ちます。

それに加えて、私の経験では、テンプレートのメタプログラミングと継承はシームレスに結合しません。主な問題は、基本クラスがテンプレートの特殊化を選択すると見なされないことです。つまり、一部のメタ関数が に特化されている場合、fusion::vectorから派生した型でそれを使用できなくなりますfusion::vector

私の記憶が正しければ、Fusion はタグ ディスパッチと特性クラスを使用して実装を選択するため、これが問題になる可能性があります。デフォルトの特性クラスは、ネストされた typedef を単純に「転送」すると思うので、typedef が継承されるため、ここで機能する可能性がありますが、これが信頼できるかどうかはわかりません (実装が変更される可能性があります)。

最後に、Fusion コンテナーは (構築と代入に必要なものを除いて) メンバー関数を提供しないため、それらから派生する用途はほとんどありません。クラスに Fusion (メタ) 関数との互換性を持たせたい場合は、ライブラリが提供する拡張メカニズムを使用する必要があります。

于 2011-08-11T14:09:28.993 に答える