如何将 class' 非静态方法传入 class' 数据成员的构造函数

how to pass in class' non-static method into class' data member's constructor

我有一个 class C 方法 funcC 也有一个数据成员 m_func_taker 其构造函数采用 std::function 参数。如何将 C::func 传递给 m_func_taker 的构造函数?

我有一些示例代码(点击here到运行):

#include <iostream>
#include <functional>

template<typename out_t, typename in_t>
struct my_type{
    using F = std::function<out_t(in_t)>;
    F m_f;
    my_type(F f) : m_f(f) {}
};

class C{
public:
    my_type<double,double> m_func_taker;
    
    double func(double in) { 
        return 2*in; 
    }
    
    C() : m_func_taker(func) {}
    
    
};


int main() {
    // your code goes here
    return 0;
}

我收到以下错误:“prog.cpp:19:25: 错误:无效使用非静态成员函数‘double C::func(double)’ C() : m_func_taker(函数) {}"

当我将方法更改为 static 并更改

时编译正常
C() : m_func_taker(C::func) {}

但在我的真实程序中我做不到。

您可以使用 lambda 来实现(绑定 this 指针):

class C {
...    
    C() : m_func_taker ([this] (double in) { return this->func (in); }) {}
};

您可以将对方法的调用包装在 lambda 中:

C() : m_func_taker([this](auto d) { return this->func(d); }) {}

这是一个demo


要从 class 的方法构建 std::function,您可以使用 std::bind:

using std::placeholders::_1;
C() : m_func_taker(std::bind(&C::func, this, _1)) {}

这是一个demo


从 c++20 开始,您可以使用 std::bind_front:

来简化它
C() : m_func_taker(std::bind_front(&C::func, this)) {}

这里是 demo