请考虑以下代码段:
struct Base { virtual void func() { } }; struct Derived1 : Base { void func() override { print("1"); } }; struct Derived2 : Base { void func() override { print("2"); } }; class Manager { std::vector<std::unique_ptr<Base>> items; public: template<class T> void add() { items.emplace_back(new T); } void funcAll() { for(auto& i : items) i->func(); } }; int main() { Manager m; m.add<Derived1>(); m.add<Derived2>(); m.funcAll(); // prints "1" and "2" };
我正在使用虚拟调度,以便从多态对象的std :: vector调用正确的override方法.
但是,我知道多态对象的类型,因为我在Manager :: add< T>中指定了它.
我的想法是通过获取成员函数T :: func()的地址并直接将其存储在某处来避免虚拟调用.但是这是不可能的,因为我需要将它存储为void *并将其转换回Manager :: funcAll(),但我当时没有类型信息.
我的问题是:似乎在这种情况下,我有比平常更多的信息用于多态(用户在Manager :: add< T>中指定派生类型T) – 有什么方法可以使用这种类型信息来防止看似不需要的虚拟电话? (但是,用户应该能够在其代码中创建自己的Base派生类.)