3

テンプレート化されたクラスを (部分的に) 次のように定義しています。

template <class T> MyClass
{
public:
   void DoSomething(){}
};

別のクラスから DoSomething を呼び出したいが、同じ場所にある複数の「T」型に対してこれを実行できる場合、メソッド関数ポインターはクラス型に一意に制約されているため、アイデアに行き詰まります。もちろん、各 MyClass は異なる型であるため、MyClassDoSomething() への関数ポインタを「ポリモーフィック」な方法で格納することはできません。

私のユースケースは、保持クラスに「DoSomething」への関数ポインターのベクトルを格納して、格納されているすべてのクラスを 1 か所から呼び出すことができるようにすることです。

誰か提案はありますか?

4

2 に答える 2

13

わかりましたので、ファンクター ソリューションは必要に応じて機能しません。おそらく、共通の基本「インターフェイス」クラスからテンプレート クラスを継承する必要があります。そして、それらのベクトルを使用します。

このようなもの:

class Base { 
public:
  virtual ~Base(){}
  virtual void DoSomething() = 0;
}

template <class T> class MyClass : public Base {
public:
    void DoSomething(){}
};

std::vector<Base *> objects;
objects.push_back(new MyClass<int>);
objects.push_back(new MyClass<char>);
于 2008-09-28T17:31:54.957 に答える
0

それがまさに私がする必要があったことです。奇妙なことに、私は早い段階で自分のユースケースに有効なソリューションとしてそれを割り引いていましたが、今ではその理由がわかりません。コンパイル時のディスパッチのために同じ場所で行っているいくつかのメタプログラミングに目がくらんでいたと思います(つまり、混乱した脳でコンパイル時と実行時を混同しています)。

衝撃をありがとう!

于 2008-09-28T17:45:55.300 に答える