What is the meaning of this star (*) symbol in C++? — Pointer to member

后端 未结 1 1275
小鲜肉
小鲜肉 2020-12-10 16:49

In my project, there are a few lines in a MyClass.h file

class MyClass{
public:
....

#ifndef __MAKECINT__
  std::vector

        
相关标签:
1条回答
  • 2020-12-10 17:06

    ::* denotes a Pointer to member.

    With the surrounding code it's actually a Pointer to member function.

    Status_e(MyClass::*)(TupleInfo & info)
    

    is a member function of class MyClass, returning Status_e, and having one parameter TupleInfo&. (The argument name info is useless here but obviously silently ignored by the compiler.)

    The other snippet in OP's question shows how to call it:

    status = (this->*m_processObjects[f])(m_tuples[i]);
    

    Storing a method pointer would look like this:

    std::vector<Status_e(MyClass::*)(TupleInfo & info)> m_processObjects;
    

    ...

    m_processObjects.push_back(&MyClass::aMethod);
    

    Of course, the signature of MyClass::aMethod must match.

    A simplified sample to demonstrate it:

    #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;
    }
    

    Output:

    Test::func1 called from 'main()': Return: 1
    Test::func2 called from 'main()': Return: 2
    Test::func3 called from 'main()': Return: 3
    Test::func1 called from 'Test::call()': Return: 1
    Test::func2 called from 'Test::call()': Return: 2
    Test::func3 called from 'Test::call()': Return: 3
    

    Live Demo on coliru.com

    0 讨论(0)
提交回复
热议问题