c++ - std::unordered_map 中的 std::function,错误 C3867 非标准语法;使用 '&' 创建指向成员的指针
问题描述
我尝试if/else
通过使用地图调用一些api来替换
为什么初始化列表会抛出错误?
...
#include <functional>
#include <unordered_map>
class MyClass final : public Base
{
std::string InfoInquiry(Class_1& request, Class_2& response);
std::string ActivateDeactivate(Class_1& request, Class_2& response);
...
using Callback = std::function<std::string(Class_1&, Class_2&)>;
const std::unordered_map<std::string, Callback> m_ApiCalbacks{ //error C3867: 'MyClass ::InfoInquiry': non-standard syntax; use '&' to create a pointer to member
{"INFO", InfoInquiry},
{"ACTIVATE_DEACTIVATE", ActivateDeactivate},
...
};
}
注意:static
在这种情况下是不允许的,因为它在 dll 中并且重新加载 dll 会出现问题
解决方案
我会主张为此使用指向成员的指针。std::function
附带成本(至少一个额外的间接,即慢)。
像这样的东西(为简洁而编辑):
#include <functional>
#include <map>
#include <iostream>
class MyClass
{
public:
std::string InfoInquiry() { return "info!"; }
std::string ActivateDeactivate() { return "activate!"; }
using Callback = std::string (MyClass::*) ();
const std::map<std::string, Callback> m_ApiCalbacks {
{"INFO", &MyClass::InfoInquiry},
{"ACTIVATE_DEACTIVATE", &MyClass::ActivateDeactivate}
};
std::string Call(std::string const& name) {
auto it = m_ApiCalbacks.find(name);
if (it == m_ApiCalbacks.end()) // optional check if name is valid
return "???";
return (this->*(it->second))();
}
};
int main() {
MyClass c;
std::cout << c.Call("INFO") << "\n";
std::cout << c.Call("ACTIVATE_DEACTIVATE") << "\n";
std::cout << c.Call("X") << "\n";
}
额外说明:在某些 C++ 实现中,std::map
比std::unordered_map
. 检查确定。(现场演示)
推荐阅读
- asp.net - 保存动态 Web 用户控件 vb.net
- scala - 如何在 Scala Spark 中使用具有许多条件的“.withColumn”为数据集创建新列
- ios - UIWebView 加载时显示 SVProgressHUD
- javascript - Slick carousel - 使用 3 张幻灯片和 autoPlay=true 会导致滑块导航的行为就像有 5 张幻灯片一样
- r - 为 R 脚本创建日期(月)例外
- javascript - 如何从 iframe 标签中获取 data-id 值?
- javascript - 以这种方式使用平面地图是否合适?
- reactjs - 为什么我无法从 React/ReactNative 客户端应用程序监听 socket.io 事件?
- extjs - 在 ExtJs 的 CellEditing 插件中,如果我们放入安全字符串,那么它会执行
- python - 是否可以将 exe 文件添加到 cx_freeze python bdist_msi 中?