3

次のようなクラスがあるとします

template<class T>
struct A {
  void foo() {
    // Need access to "T" here
    typedef typename someTrait<T>::someType T2;
  }
};

foo()クラスのインスタンス (またはそのポインター) をコンテナー (おそらく STL) に「登録」(または格納) して、登録されているすべてのインスタンスのメソッドを後で呼び出すことができます。

異なるテンプレート パラメータでインスタンス化されたインスタンスが格納されるため ( A<int>A<float>、...)、明らかに、 を使用しstd::vectorてインスタンスまたはそのポインタを格納することはできません。私が想像できるのは、メソッドを作成し、次のようstaticに関数ポインターを格納することです。void foo()

 void static foo();

 typedef void (* fooPtr)(void);
 std::vector<fooPtr>

しかし、どういうわけか、これはあまり C++11 らしくないと感じています。ラッパークラスなどを導入する良い解決策はありますか?

基本クラスを導入し、動的キャストを使用すると、依存関係が導入されRTTIますよね? への依存を避けたいRTTI

C++11 でこれを行うにはどうすればよいでしょうか? (Boost へのリンクや への依存など、追加の依存関係を導入したくありませんRTTI。)

ご意見ありがとうございます!

4

2 に答える 2

5

おそらく、仮想メソッドを使用できますか?これは C++03 でも機能します。

struct ABase {
    virtual void foo() = 0;
};

template<class T>
struct A : ABase {
    virtual void foo() override {
        // Access to "T" here
    }
};

...

std::vector<std::unique_ptr<ABase>> vec;
vec.emplace_back(new A<int>());
vec.emplace_back(new A<float>());

for (auto& p_a : vec)
    p_a->foo();
于 2012-10-25T09:17:23.753 に答える
5

実際に関数の配列が必要な場合は、std::functionwith を組み合わせて使用​​できますstd::bind

std::vector<std::function<void()> vec;
A<int> a;
vec.push_back(std::bind(&A<int>::foo, &a)); //now a should live at least as long, as vec
// or vec.push_back(std::bind(&A<int>::foo, a)); - now a will be _copied_ to vec

foo今はメンバー関数です(std::bindここで関数を指定された変数に「バインド」します)

于 2012-10-25T09:24:02.900 に答える