const 成员函数的 std 函数包装器

std functional wrapper of const member function

#include <functional>
#include <iostream>

struct Foo {
    Foo(int num) : num_(num) {}
    void print_add(int i) const { std::cout << num_+i << '\n'; }
    int get_num(int i) { return num_;}
    void set_num(int i) { num_ = i;}
    int num_;
};
int main() {
    std::function<int(const Foo *, int)> f_get_num;
    f_get_num = &Foo::get_num;
    return 0;
}

这将在第 f_get_num = &Foo::get_num 行产生一个错误,error: invalid conversion from ‘const Foo*’ to ‘Foo*’ [-fpermissive]Foo::get_num 类型是 int (Foo:: *fp)(int)。谁能解释一下?谢谢。

您不能在 const 对象上调用非 const 函数。您可以将 const Foo* 传递给 f_get_num,但 Foo::get_num 接受非常量隐式 this.

下面两个调用同样是非法的:

Foo foo;
Foo const* const_ptr = &foo;

const_ptr->get_num(42);
f_get_num(const_ptr, 42); // results in const_ptr->get_num(42)

您可以声明您的 get_numconst:

int get_num(int i) const { return num_;}

然后您的代码将正常工作。

另一种方法是让你的 f_get_num 接受非 const 参数,但是当你的函数是 getter 并且不应该修改对象。

std::function<int(Foo*, int)> f_get_num;
f_get_num = &Foo::get_num;