如何调用已保存在自定义结构向量中的成员函数指针?

时间:2018-08-18 01:17:12

标签: c++ c++11 c++14 member-function-pointers

我的问题实际上是关于already asked question。我已经尝试过answer given by @r3mus n0x,但也看到了一些SO问题,这些问题并没有帮助我对上述情况有一个清晰的认识。

在给定的帖子中缺少MCVE,因此我尝试了一下,并想出了以下代码,并且出现了与@ user10213044在他/她的帖子中提到的错误相同的错误。

Error msg

error C2065: 'm_func': undeclared identifier

我的问题:

Q1 :我们真的可以将指向类的某些成员函数的指针(如以下示例中)存储到私有成员(例如,矢量数组)上吗?如果是这样,则出现上述错误消息的原因是什么?

第二季度:我也尝试在for循环中编写代码:

classFuncPtr fun = bindClassPtr->m_func; // compiles
fun(str); // error

给我:Error msg

error: must use '.*' or '->*' to call pointer-to-member function in 'fun (...)', e.g. '(... ->* fun) (...)'
 fun(str); // error

我听不懂。有人可以告诉我在这种情况下出了什么问题吗?

第二次尝试与以下情况类似,我们将其用于普通函数指针情况。

typedef void(*FuncPtr)(const std::string&);
FuncPtr Lambda = [](const std::string& str) { std::cout << str << std::endl; };
Lambda(std::string("Hellow World"));

这是我尝试的代码:

#include <iostream>
#include <vector>
#include <string>
#include <memory>

class MyClass;          
typedef void (MyClass::*classFuncPtr)(const std::string&); // function ptr to MyClass::member functions

struct MyBind // bind struct
{
   classFuncPtr m_func;
   explicit MyBind(const classFuncPtr& func): m_func(std::move(func)) {}
};

class MyClass
{
    std::string m_var;
    std::vector<std::unique_ptr<MyBind>> my_binds_;
public:
   MyClass() // constructor 
   {
      my_binds_.emplace_back( std::make_unique<MyBind>( std::move(&MyClass::do_this) ));
      my_binds_.emplace_back( std::make_unique<MyBind>( std::move(&MyClass::do_that) ));
   }

   // two functions to bind
   void  do_this (const std::string& str) { std::cout << "From do this: " << str << std::endl;   }
   void  do_that (const std::string& str) { std::cout << "From do that: " << str << std::endl;   };

   void handle_input(const std::string& str)
   {

      for (const std::unique_ptr<MyBind>& bindClassPtr: my_binds_)
      {
          // how to print passed string str here??              (Q1)
          (bindClassPtr->*m_func)(str);

          /*
          classFuncPtr fun = bindClassPtr->m_func; // compiles   (Q2)
          fun(str); // error
          */
      }
   }
};

1 个答案:

答案 0 :(得分:3)

您的第一次尝试失败,因为范围中没有名为m_func的变量。

您的第二次尝试失败,因为指向成员的指针要求调用一个对象。

正确的语法是:

classFuncPtr fun = bindClassPtr->m_func;
(this->*fun)(str);

Live Demo

MyBind对象中包含的指针实际上没有绑定任何东西。它是指向MyClass成员的指针,因此您必须为其提供一个MyClass的实例。