我试图使用std::map
键值对调用函数。我发现这个stackoverflow文章调用一个函数取决于一个变量?但是解决方案
std::map<std::string, std::function<void()>> le_mapo;
不起作用并导致类似于&;error:左值需要作为一元' & '操作数"使用它作为so
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
我试图用这个方法在同一个类中调用一个函数,它会导致左值错误任何想法做什么
我也试过在顶部使用
#define BE_EVIL(map, function, x) map[ #x ] = & function ## x
注意:我有所有适当的包括,如
#include <iostream>
#include <map>
#include <functional>
这里是一个可复制的例子
#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();
}
因为ftp
是一个成员函数,所以你必须在这里使用lambda(好吧,你可以使用std::bind
,但lambda现在已经在很大程度上取代了它)。
所以你想:
le_mapo["ftp"] = [this](){ ftp(); };
这"captures"this
,从而使您能够在正确的对象上调用ftp()
。
&ftp()
不工作的原因有很多:
附加
()
意味着您正在尝试调用该函数(然后获取它返回的任何地址),而不是直接获取ftp
的地址。获取成员函数地址的语法是
&stackoverflow::ftp
,而不仅仅是&ftp
。你没有在任何地方传递
this
,所以调用者不会有一个对象来调用ftp
。
This:
le_mapo["ftp"] = &ftp();
是错误的,因为ftp()
调用了函数,然后才应用了赋值操作符。虽然你不能取void
的地址。函数指针为&stackoverflow::ftp
。
需要一个对象来调用成员函数。std::function
具有一些魔力,可以将成员函数转换为可调用对象,并将该对象作为参数,因此可以这样工作:
stackoverflow::stackoverflow()
{
std::map<std::string, std::function<void(stackoverflow&)>> le_mapo;
le_mapo["ftp"] = &stackoverflow::ftp;
}
调用map中的函数时,必须传递对stackoverflow
类型对象的引用,该对象将用于调用成员函数。
或者,您可以将对象与成员函数一起包装在lambda中,如另一个答案所示。
PS:我猜你的代码中有一个错别字,因为:
void ftp()
{
std::cout << "Minimal reproduction" << std::endl;
}
是一个与stackoverflow::ftp
完全无关的自由函数。当ftp
是一个自由函数时,您不需要lambda(其他答案)或带有附加参数的std::function
。对于免费函数,您所需要的就是Q&A链接中的答案。