C++ 这个星号(*)在C++;?——指向成员的指针

C++ 这个星号(*)在C++;?——指向成员的指针,c++,pointers,C++,Pointers,在我的项目中,MyClass.h文件中有几行 class MyClass{ public: .... #ifndef __MAKECINT__ std::vector<Status_e(MyClass::*)(TupleInfo & info)> m_processObjects; //! #endif .... } //The Status_e is an enum type //The TupleInfo is a struct 我从来没有听说过像this->*b

在我的项目中,
MyClass.h
文件中有几行

class MyClass{
public:
....

#ifndef __MAKECINT__
  std::vector<Status_e(MyClass::*)(TupleInfo & info)> m_processObjects; //!
#endif
....
}
//The Status_e is an enum type
//The TupleInfo is a struct

我从来没有听说过像
this->*blabla
这样的用法,但是这个代码片段很有效。那么它是什么意思呢?

::*
表示

与周围的代码,它实际上是一个

类MyClass
的成员函数,返回
状态_e
,具有一个参数
TupleInfo&
。(参数名
info
在这里是无用的,但显然被编译器默默忽略。)

OP问题中的另一个片段显示了如何调用它:

status = (this->*m_processObjects[f])(m_tuples[i]);
存储方法指针的方式如下所示:

std::vector<Status_e(MyClass::*)(TupleInfo & info)> m_processObjects;
当然,
MyClass::aMethod
的签名必须匹配

一个简化的示例来演示它:

#include <iostream>
#include <vector>

class Test {
  
  private:
    std::vector<int(Test::*)(const char*)> _tblTestFuncs;
  public:
    Test()
    {
       _tblTestFuncs.push_back(&Test::func1);
       _tblTestFuncs.push_back(&Test::func2);
       _tblTestFuncs.push_back(&Test::func3);
    }
  
    int func1(const char *caller) { std::cout << "Test::func1 called from '"<< caller << "': "; return 1; }
    int func2(const char *caller) { std::cout << "Test::func2 called from '"<< caller << "': "; return 2; }
    int func3(const char *caller) { std::cout << "Test::func3 called from '"<< caller << "': "; return 3; }
    
    void call()
    {
      for (size_t i = 0, n = _tblTestFuncs.size(); i < n; ++i) {
        int result = (this->*_tblTestFuncs[i])("Test::call()");
        std::cout << "Return: " << result << '\n';
      }
    }
};

int main()
{
  Test test;
  // test method vector in main()
  std::vector<int(Test::*)(const char*)> tblTestFuncs;
  tblTestFuncs.push_back(&Test::func1);
  tblTestFuncs.push_back(&Test::func2);
  tblTestFuncs.push_back(&Test::func3);
  for (size_t i = 0, n = tblTestFuncs.size(); i < n; ++i) {
    int result = (test.*tblTestFuncs[i])("main()");
    std::cout << "Return: " << result << '\n';
  }
  // test method vector in Test
  test.call();
  // done
  return 0;
}

实际上,符号是
::*
@RSahu重复的链接并没有那么幸运。实际上,关于指向成员函数的指针的Q/a会更匹配,例如,让我们再给这个问题一次机会。重新开放。m_processObjects是函数指针的std::vector。这是否回答了您的问题?
std::vector<Status_e(MyClass::*)(TupleInfo & info)> m_processObjects;
m_processObjects.push_back(&MyClass::aMethod);
#include <iostream>
#include <vector>

class Test {
  
  private:
    std::vector<int(Test::*)(const char*)> _tblTestFuncs;
  public:
    Test()
    {
       _tblTestFuncs.push_back(&Test::func1);
       _tblTestFuncs.push_back(&Test::func2);
       _tblTestFuncs.push_back(&Test::func3);
    }
  
    int func1(const char *caller) { std::cout << "Test::func1 called from '"<< caller << "': "; return 1; }
    int func2(const char *caller) { std::cout << "Test::func2 called from '"<< caller << "': "; return 2; }
    int func3(const char *caller) { std::cout << "Test::func3 called from '"<< caller << "': "; return 3; }
    
    void call()
    {
      for (size_t i = 0, n = _tblTestFuncs.size(); i < n; ++i) {
        int result = (this->*_tblTestFuncs[i])("Test::call()");
        std::cout << "Return: " << result << '\n';
      }
    }
};

int main()
{
  Test test;
  // test method vector in main()
  std::vector<int(Test::*)(const char*)> tblTestFuncs;
  tblTestFuncs.push_back(&Test::func1);
  tblTestFuncs.push_back(&Test::func2);
  tblTestFuncs.push_back(&Test::func3);
  for (size_t i = 0, n = tblTestFuncs.size(); i < n; ++i) {
    int result = (test.*tblTestFuncs[i])("main()");
    std::cout << "Return: " << result << '\n';
  }
  // test method vector in Test
  test.call();
  // done
  return 0;
}