c++ - 使用函数指针的 STL 映射

标签 c++ stl map function-pointers

我开发了一个具有许多内置函数的脚本引擎,因此要调用任何函数,我的代码只需进入 if .. else if .. else if 墙检查名称,但我希望开发更有效的解决方案。

我应该使用 hashmap,其中字符串作为键,指针作为值吗?我怎么能通过使用 STL 映射来做到这一点?

编辑: 我想到的另一点:当然使用映射会强制编译器不要内联函数,但我的低效方法没有因函数调用的必要性而产生任何开销,它只是执行代码。

所以我想知道函数调用产生的开销是否会比拥有 if..else 链更好。否则我可以通过在运行时检查一个字符来最小化比较次数(会更长但更快)。

最佳答案

无论你的函数签名是什么:

typedef void (*ScriptFunction)(void); // function pointer type
typedef std::unordered_map<std::string, ScriptFunction> script_map;

// ...

void some_function()
{
}

// ...

script_map m;
m.emplace("blah", &some_function);

// ...

void call_script(const std::string& pFunction)
{
    auto iter = m.find(pFunction);
    if (iter == m.end())
    {
        // not found
    }

    (*iter->second)();
}

请注意 ScriptFunction类型可以概括为 std::function</* whatever*/>所以你可以支持任何可调用的东西,而不仅仅是函数指针。

关于c++ - 使用函数指针的 STL 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2136998/

相关文章:

c++ - 如何解析函数及其参数

c++ - std::vector 迭代器失效

map - 尝试在 Go 中实现 map 合并功能但失败

c++ - Rcpp map /字典/列表

c++ - 如何在 C++ 中实现分布式 map 的 API?

c++ - 连接错误 : Invalid argument at sockets

c++ - 为新文件类型重载 >> 运算符的优雅方法是什么?

c++ - 从命令行定义源文件的宏

c++ - STL 中的自由函数是否需要 namespace ?

c++ - 将 C++ std::vector<std::string> 转换为 std::vector<unsigned char> (反之亦然)