2011-01-13 4 views
0

奇妙なトピックについて申し訳ありませんが、正確に私の質問を合成する方法を知らなかった。ここに問題があります:どのようにこの問題(Interface + template + reuse code)を扱うのですか

私はタイプのstd :: vectorを含むクラスのセットを持っています。

template <typename T> 
class Container 
{ 
    T createObject() { T* obj=new T; _objects.push_back(obj); } 
    std::vector<T> _objects; 
} 

このテンプレートを異種地図に保存する必要があるときに問題が発生します。これらはテンプレートなので、初期化するまで存在しません。私はContainerをダミーのIContainerから派生させて良いスタートポイントを得ることを考えましたが、createObjectがテンプレート化される必要があるので、IContainerをhetrogenousマップに追加することができますが、createObject() static_castのように感じることはありません。誰かがこれに対する解決策を提案できますか?

ありがとうございます。 アマラル。

+5

そのコードは意味をなさない。 'createObject'は' T'を返しますが、return文はなく、 '_objects'は' T'を保存しますが、 'T *'を追加しようとします。 – GManNickG

+3

含まれる 'T'型は継承によって関連していますか?共通の基盤への継承?あなたは価値あるものを返す必要がありますか、あるいはポインタで返すことができますか?あなたが解決したい本当の問題を述べるなら、あなたがやりたいことより簡単な解決策があるかもしれません。解決策ではなく、問題について覚えておいてください。 –

+0

私はあなたのオブジェクトがいくつかの 'std :: vector'を含んでいると思うので、必ずしも" templatizing "の良い候補ではありません。実際、*必要なときにテンプレートを使用したいと思います。 –

答えて

0

boost::anyのようなものになっているようです。 http://www.boost.org/doc/libs/1_49_0/doc/html/any/s02.html

を要約すると参照してください:あなたは、もはや、あなたのケースでは、クラスをテンプレートにだけ追加機能を必要としないだろう

class Container 
{ 
    std::vector<boost::any> _objects; 

public: 
    template <class T> 
    void Add(const T& t) { _objects.push_back(t); } 
} 

どのようなタイプであるのかわからないため、ベクター内のオブジェクトを扱うのが難しくなります。使用したいときは、どのタイプのものであるかをテストする必要があります。

あなたはより良いあなたがやろうとしているかを説明する必要がある - 私はあなたがはないが実際にboost::anyを使いたいんよね。

関連する問題