std :: unsted_map中的std :: function,错误C3867非标准语法;使用“&"创建一个指向成员的指针 [英] std::function in std::unordered_map, error C3867 non-standard syntax; use '&' to create a pointer to member
问题描述
我尝试通过使用地图调用一些api来替换 if/else
为什么初始化列表会引发错误?
...#include< functional>#include< unordered_map>class MyClass final:公共基础{std :: string InfoInquiry(Class_1& request,Class_2& response);std :: string ActivateDeactivate(Class_1& request,Class_2& response);...使用Callback = std :: function< std :: string(Class_1& ;, Class_2&)> ;;const std :: unordered_map< std :: string,Callback>m_ApiCalbacks {//错误C3867:'MyClass :: InfoInquiry':非标准语法;使用&"创建一个指向成员的指针{"INFO",InfoInquiry},{"ACTIVATE_DEACTIVATE",ActivateDeactivate},...};}
注意:在这种情况下,不允许使用 static
,因为它位于dll中,并且重新加载dll会遇到问题
我建议使用指向成员的指针. std :: function
附带费用(至少有一个额外的间接寻址,即速度很慢).
类似这样的内容(为简洁起见进行了编辑):
#include< functional>#include< map>#include< iostream>类MyClass{上市:std :: string InfoInquiry(){返回"info!";}std :: string ActivateDeactivate(){返回"activate!";}使用Callback = std :: string(MyClass :: *)();const std :: map< std :: string,Callback>m_ApiCalbacks {{"INFO",& MyClass :: InfoInquiry},{"ACTIVATE_DEACTIVATE",& MyClass :: ActivateDeactivate}};std :: string调用(std :: string const& name){自动它= m_ApiCalbacks.find(name);if(it == m_ApiCalbacks.end())//可选检查名称是否有效返回"???";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
更快.检查以确保.(实时演示)
I try to replace if/else
by using a map to call some api
why the initializer list throws the error?
...
#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},
...
};
}
note: static
is not allowed in this case because it's in a dll and reloading the dll gets problems
I would argue for using pointers-to-members for this. std::function
comes with a cost (at least one extra indirection, i.e. slow).
Something like this (edited for brevity):
#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";
}
Bonus note: in some C++ implementations, std::map
is faster than std::unordered_map
. Check to be sure. (Live demo)
这篇关于std :: unsted_map中的std :: function,错误C3867非标准语法;使用“&"创建一个指向成员的指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!