2

あらゆる種類のオブジェクト(オブジェクト、オブジェクトなど)を1つのshared_ptrに入れたいです。そこで、基本クラスを作成し、shared_ptrを使用しました。

しかし、どうすれば宣言できますか

T getMember();

基本クラス内でObjectBase.getMemberを呼び出すことができますか?

class ObjectBase
{
public:
  //virtual getMember HOWTO?
};

template<typename T>
class Object : public ObjectBase
{
public:
  Object(T x):member(x) { }
  T getMember() { return member; }

private:
  T member;
};
4

2 に答える 2

3

できません。あらゆる種類の型を返すことができるように、そのような宣言はどのように見えるべきですか?それは不可能です。ObjectBase*を正しくキャストしてから、関数Object<T>*を使用する必要がありgetMemberます。Tすべてが共通の基本クラスを共有している場合にのみ可能であるため、それへのポインターを返すことができます。しかし、それはに厳しい制約を課しますT

于 2011-03-28T10:15:13.110 に答える
0

それはできません。コンパイラーは、使用可能なさまざまな仮想関数(およびオーバーロード)の数を事前に知っている必要がありますが、あなたの場合、派生型の新しい潜在的なインスタンス化に基づいて、オンデマンドで新しい仮想メンバー関数を追加することを検討しています。

ほとんどの場合、完全に無関係なオブジェクトを同じコンテナーに保持することは適切な設計オプションではありませんが、実際にそうであるいくつかのケースでは、バリアントタイプを使用できます(実際のオブジェクトに応じて、boost ::anyまたはboost::variantを検討してください)要件。これは、直接使用できる可能性のあるバリアントタイプのバンドルされたテスト済みの実装です。

于 2011-03-28T10:29:34.910 に答える