std::unordered_map<std::string,std::function<void(std::string&) 是否只能容纳静态函数?
Does std::unordered_map<std::string,std::function<void(std::string&) can hold only static functions?
这是这个问题的延续
我试图使用 std::function
而不是函数指针,并且只有当函数是静态的时我才能插入函数。否则我会得到以下错误
main.cpp:15:11: error: no matching member function for call to
'insert'
map.insert(std::make_pair("one",&Example::procesString));
#include<string>
#include <unordered_map>
#include<functional>
namespace Test
{
namespace Test
{
class Example
{
public:
Example()
{
map.insert(std::make_pair("one",&Example::procesString));
}
static void procesString(std::string & aString)
//void procesString(std::string & aString) -> compiler error
{
}
static void processStringTwo(std::string & aString)
{
}
std::unordered_map<std::string,std::function<void(std::string&)>> map;
};
}
}
int main()
{
return 0;
}
在这种情况下,您的 std::function
类型是错误的。对于成员函数 Example::processString(std::string&)
:
std::function<void(Example*, std::string&)>
但是,您可以通过提前绑定避免这个和 "eat up" 那个 this
参数:
using std::placeholders;
map.insert(std::make_pair("one", std::bind(&Example::processString, this, _1));
现在唯一未绑定的参数是字符串引用,因此类型可以保留:
std::function<void(std::string&)>
这是这个问题的延续
我试图使用 std::function
而不是函数指针,并且只有当函数是静态的时我才能插入函数。否则我会得到以下错误
main.cpp:15:11: error: no matching member function for call to 'insert'
map.insert(std::make_pair("one",&Example::procesString));
#include<string>
#include <unordered_map>
#include<functional>
namespace Test
{
namespace Test
{
class Example
{
public:
Example()
{
map.insert(std::make_pair("one",&Example::procesString));
}
static void procesString(std::string & aString)
//void procesString(std::string & aString) -> compiler error
{
}
static void processStringTwo(std::string & aString)
{
}
std::unordered_map<std::string,std::function<void(std::string&)>> map;
};
}
}
int main()
{
return 0;
}
在这种情况下,您的 std::function
类型是错误的。对于成员函数 Example::processString(std::string&)
:
std::function<void(Example*, std::string&)>
但是,您可以通过提前绑定避免这个和 "eat up" 那个 this
参数:
using std::placeholders;
map.insert(std::make_pair("one", std::bind(&Example::processString, this, _1));
现在唯一未绑定的参数是字符串引用,因此类型可以保留:
std::function<void(std::string&)>