我想创建一个可以访问一族类的成员函数的类。进入更多细节,我有类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似乎意味着静态演员可以胜任这项工作,但我没有发现这是真的。
关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
static_cast 确实只需要将类型Child::*
的指针指向成员转换为Base::*
类型,以下代码段:
struct ChildOfMultiMap : MultiMap {
...
};
...
void(ChildOfMultiMap::* child_mem_ptr)(double) = &ChildOfMultiMap::set;
mapsSetPtr ptr = static_cast<mapsSetPtr> (child_mem_ptr);
请记住,如果您偶然在Base
的实例上使用指向成员的指针(而不是相关的{{ 1}})。
在下面的代码段中,我们使用与前面描述的完全相同的方法,尽管在Child
类型的对象上调用Child::func
会导致 undefined-behavior ,因为我们正在访问函数内部的不存在的成员。
Base
struct Base {
/* ... */
};
struct Child : Base {
void func () {
this->x = 123;
}
int x;
};