从结构中调用由指针到成员函数指向的函数

Jir*_*Jir 4 c++ pointer-to-member

我有一个Test具有特殊数据结构的类.类的成员Teststd::map键是a的位置std::string,映射值的struct定义如下:

typedef struct {
  void (Test::*f) (void) const;
} pmf_t;
Run Code Online (Sandbox Code Playgroud)

初始化地图是可以的.问题是当我试图调用指向的函数时.我制作了一个再现问题的玩具示例.这里是:

#include <iostream>
#include <map>

using namespace std;

class Test;
typedef void (Test::*F) (void) const;
typedef struct {
  F f;
} pmf_t;


class Test
{
public:
  Test () {
    pmf_t pmf = {
      &Test::Func
    };
    m["key"] = pmf;
  }
  void Func (void) const {
    cout << "test" << endl;
  }
  void CallFunc (void) {
    std::map<std::string, pmf_t>::iterator it = m.begin ();
    ((*it).second.*f) (); // offending line
  }

  std::map<std::string, pmf_t> m;
};


int main ()
{

  Test t;
  t.CallFunc ();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

先谢谢你,吉尔

Rob*_*edy 5

pmf_t类型的名称是f,所以第一个更改是删除*要获取second.f.这为您提供了指向成员的指针值.要使用指向成员的指针,您需要一个实例.您唯一可用的类型是正确的this,因此请与->*运营商一起使用:

(this->*it->second.f)();
Run Code Online (Sandbox Code Playgroud)

你需要围绕整个事物的括号,否则编译器认为你试图调用it->second.f()(这是不允许的),然后将结果应用于->*.