std :: unsted_map中的std :: function,错误C3867非标准语法;使用“&"创建一个指向成员的指针 [英] std::function in std::unordered_map, error C3867 non-standard syntax; use '&' to create a pointer to member

查看:77
本文介绍了std :: unsted_map中的std :: function,错误C3867非标准语法;使用“&"创建一个指向成员的指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试通过使用地图调用一些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非标准语法;使用“&amp;"创建一个指向成员的指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆