C ++ 11将std函数绑定到重载的静态方法

时间:2018-01-15 11:49:15

标签: c++11 std-function

这个问题对我来说似乎有些愚蠢,但我找不到任何类似的问题,如果它是微不足道的话,那就很抱歉

让我们说我们有一个结构:

   this.searchService.getSearchbyDistrictCategoryCity(this.searchObj)
    .subscrie(data=>{
              this.searchedResults = data;
              this.searchService.searchResults = data; 
             // or this.messages = data
              this.messages = this.searchService.searchResults;
            },error=>this.errorMessage= <any>error);

现在在其他地方:

struct C {
  static void f(int i) { std::cerr <<  (i + 15) << "\n"; }
  static void f(std::string s) { std::cerr <<  (s + "15") << "\n"; }
};

我得到的错误是

  

错误:从''转换为   请求非标量类型'std :: function'

有没有办法在这样的上下文中使用std :: function?我错过了什么?

感谢

1 个答案:

答案 0 :(得分:4)

std::function<void(int)> f1 = C::f; // this does not compile

C::f是一个重载集,它没有地址。您可以围绕它创建一个包装器FunctionObject

std::function<void(int)> f1 = [](int x){ return C::f(x); };
void (*f2)(std::string s) = C::f;   // this compiles just fine

此行汇编是因为您通过明确地将其分配给std::string指针来“选择”C::f 重载集void(*)(std::string)重载。 / p>

您可以为f1执行相同的操作:

 std::function<void(int)> f1 = static_cast<void(*)(int)>(&C::f);