c++ - const 成员函数的 std 函数包装

标签 c++ pointer-to-member

#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] at line f_get_num = &Foo::get_numFoo::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;

关于c++ - const 成员函数的 std 函数包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39963573/

相关文章:

c++ - 我如何优化这个 S 曲线函数?

c++ - 指向成员函数的指针的问题

c++ - 其他成员函数的通用 'member function' 包装器?

c++ - 将指针传递给二维数组 C++

c++ - 使用 Crypto++ 比较恒定时间密码摘要

C++ WM_SIZE 用于最小应用程序大小

c++ - 使用指针表示法从矩阵读取数据

c++ - Windows 7 和缺少 regtlib 的情况

c++ - 将指向成员的指针强制转换为大多数派生类型

c++ - 如何从其他类调用函数指针