使用 map cpp 创建成员变量

Jon*_*tti 2 c++ dictionary functional-programming

我正在尝试使用std::map键值对调用函数。我发现这篇 stackoverflow 文章根据变量调用函数?但解决方案

std::map<std::string, std::function<void()>> le_mapo;
Run Code Online (Sandbox Code Playgroud)

不起作用并导致错误,例如“错误:左值需要作为一元'&'操作数”使用它

std::map<std::string, std::function<void()>> le_mapo;
le_mapo["ftp"] = &ftp(); // ftp function is in the same class, this function is the constructor
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用此方法调用同一类中的函数,但它导致左值错误,不知道该怎么做

我也试过在顶部使用

#define BE_EVIL(map, function, x) map[ #x ] = & function ## x
Run Code Online (Sandbox Code Playgroud)

注意:我有所有适当的包括,例如

#include <iostream>
#include <map>
#include <functional>
Run Code Online (Sandbox Code Playgroud)

这是一个可重现的示例

#include <iostream>
#include <map>
#include <functional>


class stackoverflow
{
    private:
        void ftp();
    
    public:
        stackoverflow();
};

void ftp()
{
    std::cout << "Minimal reproduction" << std::endl;
}

stackoverflow::stackoverflow()
{
    std::map<std::string, std::function<void()>> le_mapo;
    le_mapo["ftp"] = &ftp();
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*ers 6

因为ftp是成员函数,所以您将不得不在此处使用lambda(好吧,您可以使用std::bind,但如今 lambda 已在很大程度上取代了它)。

所以你要:

le_mapo["ftp"] = [this](){ ftp(); };
Run Code Online (Sandbox Code Playgroud)

这“捕获” this,从而使您能够调用ftp()正确的对象。

&ftp() 由于多种原因而不起作用:

  • 附加()意味着您正在尝试调用该函数(然后获取它返回的任何地址),而不是ftp直接获取 的地址。

  • 获取成员函数地址的语法是&stackoverflow::ftp,而不仅仅是&ftp.

  • 你没有通过this任何地方,所以调用者不会有一个对象可以调用ftp