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&)>