如何解决使用std :: function存储继承的类的方法C ++
是否可以做这样的事情?:
// 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");
}
此变量不起作用,无法创建指向成员函数的非恒定指针 因此,我的问题是:是否可以那样做以及如何做?
解决方法
您将要关闭:&temp->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]
是一个指针,因此您需要使用->
取消引用它; - 您应该使用
std::unique_ptr
代替原始拥有的指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。