C++11 将 std 函数绑定到重载的静态方法
C++11 binding std function to a overloaded static method
这个问题对我来说似乎有点傻,但我找不到任何类似的问题,如果它很琐碎,我很抱歉
假设我们有一个结构:
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<void(int)> f1 = C::f; // this does not compile
void (*f2)(std::string s) = C::f; // this compiles just fine
我得到的错误是
error: conversion from ‘’ to
non-scalar type ‘std::function’ requested
有什么方法可以在这种情况下使用 std::function 吗?我错过了什么?
谢谢
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
这一行可以编译,因为你是 "selecting" C::f
重载集 的 std::string
重载,方法是将它显式分配给 void(*)(std::string)
指针。
您可以为 f1
做同样的事情:
std::function<void(int)> f1 = static_cast<void(*)(int)>(&C::f);
这个问题对我来说似乎有点傻,但我找不到任何类似的问题,如果它很琐碎,我很抱歉
假设我们有一个结构:
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<void(int)> f1 = C::f; // this does not compile
void (*f2)(std::string s) = C::f; // this compiles just fine
我得到的错误是
error: conversion from ‘’ to non-scalar type ‘std::function’ requested
有什么方法可以在这种情况下使用 std::function 吗?我错过了什么?
谢谢
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
这一行可以编译,因为你是 "selecting" C::f
重载集 的 std::string
重载,方法是将它显式分配给 void(*)(std::string)
指针。
您可以为 f1
做同样的事情:
std::function<void(int)> f1 = static_cast<void(*)(int)>(&C::f);