【发布时间】:2012-08-29 12:44:21
【问题描述】:
我有课
class BarBase {
};
还有一个派生的模板类,它存储了一个指向成员函数的指针和一个指向同一个类的对象的指针
template<typename TypeName> class Bar: public BarBase
{
void ( TypeName::*action ) ( void );
TypeName* object;
};
我创建Bar 的实例并将指向它们的指针存储在另一个类Foo 的向量中
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->object; };。然后我比较了两个 size_t ,但我不知道,如何将 action 转换为数字...
【问题讨论】:
-
这个问题没有正确简单的解决方案。您可以在循环中使用 dynamic_cast 并检查是否 dynamic_cast 返回非空值
-
@ForEveR 为问题添加了更新。
-
您可以使用 reinterpret_cast 将函数指针转换为 void*,但这不是正确的方法。
-
@ForEveR:指向成员函数的指针不是函数指针。
-
@ForEveR 可能导致未定义的行为,void ptr 和成员 fn 指针的大小不同
标签: c++ templates pointers compare