1

タイトルがややこしいので、解いていただけると幸いです。

テンプレートを使用する単純なクラスがあります。

template <class T>
class Value
{
};

unordered_set を拡張する別のクラス:

template<class T>
class Collection : public std::unordered_set<T>
{
};

これらのクラスには両方とも他のコードがありますが、私の質問には関係ないと思います。

Collection クラスの特定の実装では、作成時に使用されたテンプレート パラメーターに関係なく、任意の Value へのポインターを取得できるようにしたいと考えています。言い換えれば、次のように意味的に似たものを持てるようにしたいのです。

class ValueCollection : public Collection<Value*>
{
};

ValueCollection *vc = new ValueCollection();
vc.insert(new Value<std::string>("hello"));
vc.insert(new Value<int>(5));

もちろん、それはうまくいきません。どうすれば同様の機能を取得できますか?

4

1 に答える 1

2

Valueクラス テンプレートに共通の基本クラスを指定し、デストラクタがあることを確認し、これvirtualを使用してインスタンス化された値を追加します。

struct ValueBase {
    virtual ~ValueBase() {}
};
template <typename T>
struct Value
    : ValueBase {
};

ところで、一般的に、STL コンテナーは継承しないほうがよいでしょう。それらは継承用に設計されていないため、保存された少量の作業から利益を得るよりも微妙な問題を引き起こす可能性が最も高くなります。

于 2012-11-25T20:35:30.397 に答える