我有课
class BarBase {
};
和一个派生模板类,其中存储了指向成员函数的指针和指向同一类对象的指针
template<typename TypeName> class Bar: public BarBase
{
void ( TypeName::*action ) ( void );
TypeName* object;
};
我创建了 Bar
的实例并将指向它们的指针存储在另一个类 Foo
的 vector 中
class Foo {
private:
vector<BarBase*> myBars;
...
};
现在进入问题。 Foo 有一个模板函数
template <typename TypeName>
void Foo::foo( TypeName* object , void ( TypeName::*action ) ( void ) )
在这个函数中,如何在 myBars
中找到字段 object
和 action
等于此函数参数的元素?如您所见,我无法直接访问像 this->myBars[i]->action
这样的字段,因为这些字段不是(也不可能是)BarBase
的成员>.
编辑
我确实可以比较 object
。我将 virtual size_t getObject (){};
添加到 BarBase
并在 Bar
中覆盖它,例如 virtual size_t getObject (){ return (size_t)this->对象; };
。然后我比较两个 size_t
,但我不知道如何将 action
转换为数字...
最佳答案
最简单的解决方案是使基类多态,并使用dynamic_cast
来确定它是否具有预期的类型:
class BarBase {
public:
virtual ~BarBase() {} // virtual function required for polymorphism
};
Bar<TypeName>* bar = dynamic_cast<Bar<TypeName>*>(myBars[i]);
if (bar && bar->object == object && bar->action == action) {
// it's a match
}
这确实增加了一些开销来支持 RTTI;在我的脑海中,我想不出任何明确定义的方法来做到这一点,而且不会增加开销。
关于C++ 操作模板对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12178280/