1

我想创建一个类来访问一系列类的成员函数。更详细地说,我有类 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 对象时,编译器会抱怨我给了它错误的参数类型。

此外,这篇文章似乎暗示静态演员可以完成这项工作,但我还没有发现这是真的。

关于如何解决这个问题的任何想法?

4

1 回答 1

1

static_cast确实是将指针类型的成员Child::*转换为type所需的全部Base::*内容,请参见以下代码段:

struct ChildOfMultiMap : MultiMap { 
   ...
};

...

void(ChildOfMultiMap::* child_mem_ptr)(double) = &ChildOfMultiMap::set;

mapsSetPtr ptr = static_cast<mapsSetPtr> (child_mem_ptr);

请记住,如果您不小心在(而不是相关)的实例上使用指向成员的指针,这可能会很危险。BaseChild


这在什么方面可能是危险的?

在下面的代码片段中,我们使用与前面描述的完全相同的方法,尽管调用Child::func类型的对象Base会导致未定义的行为,因为我们正在访问函数内部不存在的 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 */
}
于 2012-07-16T06:04:56.470 回答