在不事先了解特定成员函数的情况下从另一个类访问成员函数
Posted
技术标签:
【中文标题】在不事先了解特定成员函数的情况下从另一个类访问成员函数【英文标题】:Accessing a member function from another class without prior knowledge of the specific member function 【发布时间】:2012-07-16 01:24:04 【问题描述】:我想创建一个可以访问一个类族的成员函数的类。更详细地说,我有类 ControlChaos 声明如下:
#define CALL_MEMBER_FN(object, ptrToMember) ((object)->*(ptrToMember))
typedef double (MultiMaps::*mapsGetPtr)();
typedef void (MultiMaps::*mapsSetPtr)(double para);
class ControlChaos
public:
ControlChaos(MultiMaps* _map,
mat orbitPoints,
colvec initCond,
mapsGetPtr getPtr,
mapsSetPtr setPtr,
double deltaMax,
double epsilonNeighborhood,
int controlIterations,
int maxIterations);
/* Other stuff here. */
;
具有类型为 mapsGetPtr 和 mapsSetPtr 等的受保护成员变量。在实现中,我使用
CALL_MEMBER_FN(map,setPtr)(someParameter);
调用我在 ControlChaos 的构造函数中使用函数指针指定的函数。我要访问的成员函数是从 MultiMaps 派生的类的成员。这段代码本身可以很好地编译。当我尝试使用指向从 MultiMaps 派生的类中的成员函数的函数指针来实例化 ControlChaos 对象时,编译器会抱怨我给了它错误的参数类型。
此外,这个article 似乎暗示静态演员可以完成这项工作,但我还没有发现这是真的。
关于如何解决这个问题的任何想法?
【问题讨论】:
我想我基本上遇到了和你一样的问题:***.com/questions/11487361/…static_cast
最终为我工作,我只是将派生方法指针转换为基本方法指针。
您可能想查找例如std::mem_fn
,或者如果您的编译器支持 C++11,std::function
和 std::bind
。
【参考方案1】:
static_cast 确实是将 Child::*
类型的 pointer-to-member 类型转换为 Base::*
所需的全部,请参见以下 sn-p :
struct ChildOfMultiMap : MultiMap
...
;
...
void(ChildOfMultiMap::* child_mem_ptr)(double) = &ChildOfMultiMap::set;
mapsSetPtr ptr = static_cast<mapsSetPtr> (child_mem_ptr);
请记住,如果您在 Base
(而不是相关的 Child
)实例上意外使用 pointer-to-member,这可能会很危险.
这有什么危险?
在下面的 sn-p 中,我们使用与前面描述的完全相同的方法,尽管在 Base
类型的对象上调用 Child::func
会导致 undefined-behavior,因为我们正在访问一个 不存在的函数内Base的成员。
struct Base
/* ... */
;
struct Child : Base
void func ()
this->x = 123;
int x;
;
int
main (int argc, char *argv[])
typedef void (Base::*BaseFuncPtr) ();
BaseFuncPtr ptr_to_child_func = static_cast<BaseFuncPtr> (&Child::func);
Base b;
(b.*ptr_to_child_func) (); /* undefined-behavior */
【讨论】:
以上是关于在不事先了解特定成员函数的情况下从另一个类访问成员函数的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中,如何在不使用 if 语句的情况下选择运行特定的成员函数?