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_num
为 const
:
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;
#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_num
为 const
:
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;