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

时间:2016-10-10 17:22:41

标签: c++ member-function-pointers

#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;
}

这会在第error: invalid conversion from ‘const Foo*’ to ‘Foo*’ [-fpermissive]行生成错误f_get_num = &Foo::get_numFoo::get_num类型为int (Foo:: *fp)(int)。任何人都可以解释一下吗?感谢。

1 个答案:

答案 0 :(得分:3)

您无法在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参数,但当你的函数是一个吸气剂并且不应该修改时,这不是你要去的方法。对象

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