C++ const成员函数的std函数包装器 #包括 #包括 结构Foo{ Foo(intnum):num_num(num){} void print_add(int i)const{std::cout

C++ const成员函数的std函数包装器 #包括 #包括 结构Foo{ Foo(intnum):num_num(num){} void print_add(int i)const{std::cout,c++,member-function-pointers,C++,Member Function Pointers,您不能在const对象上调用非const函数。您可以将const Foo*传递到f_get_num,但Foo::get_num采用非常量隐式这 以下两个呼叫同样非法: #include <functional> #include <iostream> struct Foo { Foo(int num) : num_(num) {} void print_add(int i) const { std::cout << num_+i <&l

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

以下两个呼叫同样非法:

#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;
}
您可以将您的
get_num
声明为
const

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)
然后你的代码就可以正常工作了

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

int get_num(int i) const { return num_;}
std::函数f_get_num;
f_get_num=&Foo::get_num;

为什么您认为
get_num
有签名
int(const Foo*,int)
std::function<int(Foo*, int)> f_get_num;
f_get_num = &Foo::get_num;