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;