分享
三行代码  ›  专栏  ›  技术社区  ›  Taylor

如何将类中的“非静态方法传入类”数据成员的构造函数

  •  0
  • Taylor  · 技术社区  · 1 周前

    我要上课 C 用一种方法 func . C 也有一个数据成员 m_func_taker 谁的构造函数需要一个 std::function C::func 进入之内 功能接受者

    我有一些示例代码(单击 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;
    }
    

    我得到以下错误:“项目cpp:19:25:错误:非静态成员函数double C::func(double)的使用无效 C():m_func_taker(func){}”

    static 和改变

    C() : m_func_taker(C::func) {}
    

    但我不能在我真正的程序中那样做。

    2 回复  |  直到 1 周前
        1
  •  2
  •   cigien    1 周前

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

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

    这是一个 demo .


    构造 std::function std::bind

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

    这是一个 demo .


    std::bind_front

    C() : m_func_taker(std::bind_front(&C::func, this)) {}
    

    这是一个 demo .

        2
  •  1
  •   Paul Sanders    1 周前

    你可以用一个lambda(来绑定 this

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