3

假设你有一个像

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

并且您想使用容器(可能是 STL)“注册”(或存储)类的实例(或指向它的指针),以便以后调用foo()所有已注册实例的方法。

由于要存储使用不同模板参数实例化的实例 ( A<int>, A<float>, ...) 显然不能使用 astd::vector并存储实例或指向它的指针。我能想象的是制作方法static并将函数指针存储到void foo(),例如:

 void static foo();

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

但不知何故,我觉得这不是很 C++11-ish。有没有一个很好的解决方案可以引入包装类或其他东西?

引入基类并使用动态转换会引入对 的依赖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 回答