../1.63/boost/bind/bind.hpp:75:22:类型"void (*)(const uint32_t &)"不能在"::"之前使用,因为它没有成员
我的代码看起来像这样:
template<typename T>
using RunStep = void (*)(const T& steps);
template<typename StepType, typename T>
class Stepper
{
public:
virtual void StepUp() = 0;
protected:
RunStep<StepType> runStepCallBack;
T data;
}
class StepperIO : public Stepper<uint32_t, std::string>
{
virtual void StepUp()
{
boost::bind(runStepCallBack,this, _1); //
}
}
甚至可能吗?它只是一个伪代码
如果回调还必须访问实际步进器实例的成员,则 no。也
- 您显式地将
this
参数传递到回调中(公共 API 通常使用"不透明"参数,如void* user_data
) - 或者创建一个函数对象,例如使用 lambda、boost::bind、std::bind 或手动创建。函数对象可以保存状态。标准库和 boost 有一个用于此类回调的类型擦除容器:
std::function<void(T)>
(或boost::function<...>
)。
演示:
住在科里鲁
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <iostream>
template<typename T>
using RunStep = boost::function<void(const T& steps)>;
template<typename StepType, typename T>
class Stepper
{
public:
virtual void StepUp() = 0;
protected:
RunStep<StepType> runStepCallBack;
T data;
};
class StepperIO : public Stepper<uint32_t, std::string>
{
public:
template <typename F>
void setCallback(F f) { runStepCallBack = f; }
virtual void StepUp() { runStepCallBack(1); }
};
struct Sample {
void foo(int32_t i) const { std::cout << __FUNCTION__ << "(" << i << ")n"; }
void bar(int32_t i) const { std::cout << __FUNCTION__ << "(" << i << ")n"; }
void qux(int32_t i) const { std::cout << __FUNCTION__ << "(" << i << ")n"; }
};
int main() {
StepperIO io;
Sample demo;
io.setCallback(std::bind(&Sample::foo, demo, std::placeholders::_1));
io.StepUp();
io.setCallback(boost::bind(&Sample::bar, demo, _1));
io.StepUp();
io.setCallback([&demo](int32_t i) { demo.qux(i); });
io.StepUp();
}
指纹
foo(1)
bar(1)
qux(1)
我的感觉是,打字擦除正是您要找的,请参阅更多启发性的答案:
- 只是类型擦除存储:boost::以下代码的任何替代品
- 类型擦除的多态接口:
- 生成没有虚函数的接口?
- 存储不同类型的函数指针 c++ boost::bind
- 更多样品 用于提升的容器::multi_array 相同类型但具有不同尺寸