如何将 class' 非静态方法传入 class' 数据成员的构造函数
how to pass in class' non-static method into class' data member's constructor
我有一个 class C
方法 func
。 C
也有一个数据成员 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。
我有一个 class C
方法 func
。 C
也有一个数据成员 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。