C++-将对象(如字符串)映射到表中成员函数的正确方法
C++ - proper way to map objects (like strings) to member functions in table
我正在处理由第三方API定义的事件。事件由字符串标识符识别,即"EventABC"
我需要将表中的这些(字符串(事件映射到对象的成员函数。
问题
做这件事最安全、最干净的方法是什么?
在没有进一步约束的情况下,这可以通过从std::string
到std::function<void()>
的std::map
或std::unordered_map
轻松完成。使用C++11,您可以使用lambdas来不引人注目地捕获this
对象,以调用上的成员函数
class HandlerHandler
{
std::map<std::string, std::function<void()>> handlers;
void foo();
void bar();
void frobnicate();
HandlerHandler()
{
handlers["FOO"] = [this](){ foo(); };
handlers["BAR"] = [this](){ bar(); };
handlers["FROB"] = [this](){ frobnicate(); };
}
void handle(std::string h)
{
handlers[h]();
}
};
https://godbolt.org/z/nbygdF
您可能需要防止映射中不存在h
的情况(目前,它将在尝试调用默认构造的函数时抛出异常(。
可以执行以下操作,将方法包装在std::function 中
#include <iostream>
#include <string>
#include <functional>
#include <map>
struct Target
{
void member1() {
std::cout << "member1n";
}
void member2() {
std::cout << "member2n";
}
};
int main()
{
// events will be called on this object
Target myTarget;
std::map<std::string, std::function<void(void)>> table;
table.insert({"member1", std::bind(&Target::member1, &myTarget)});
table.insert({"member2", std::bind(&Target::member2, &myTarget)});
std::string event = "member2";
table[event]();
}
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针