【问题标题】:Using std::function to store methods of inherited classes c++使用 std::function 存储继承类 c++ 的方法
【发布时间】:2020-09-29 12:56:52
【问题描述】:

有可能做这样的事情吗?:

// some_header.hpp
#ifndef SOME_HEADER_HPP
#define SOME_HEADER_HPP

class baseclass
{
public:
    baseclass(){};
    std::map<std::string, std::function<void()>> methods_map;
    void call_method(const std::string &name){
        auto it = methods_map.find(name);
        if(it != methods_map.end())
            it->second();
        else std::cout << "Method " << name << " not exists";
    }
};
#endif

与 main.cpp 相比

#include "some_header.hpp"

class inherited : public baseclass{
public:
   inherited():baseclass(){};   
   void new_meth(){
      std::cout << "Hello, stackoverflow!";
   }
};

int main(){
   std::vector<baseclass*> objects;
   auto temp = new inherited();
   objects[0].methods_map["new"]=&temp->new_meth;
   objects[0].call_method("new");
}

这个变量不起作用,无法创建指向成员函数的非常量指针 所以,我的问题是:是否有可能这样做以及如何做?

【问题讨论】:

  • 问题:这里为什么需要继承?这看起来不像这里需要的东西。如果你解释一下你需要实现什么样的功能,也许会更好。

标签: c++ oop polymorphism std


【解决方案1】:

您已接近:&amp;temp-&gt;new_meth 无效,您可以通过以下方式之一将 temp 捕获到 void() 函子中:

objects[0]->methods_map["new"] = std::bind_front(&inherited::new_meth, temp);
objects[0]->methods_map["new"] = [&] { return temp->new_meth(); }

注意事项:

  • objects[0] 是无效索引,因为您从未在该向量中插入任何内容;
  • objects[0]是一个指针,所以需要用-&gt;解引用;
  • 您应该使用 std::unique_ptr 而不是原始的拥有指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多