../ 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); //
}
}
甚至可能吗?它只是一个伪代码
答案 0 :(得分:1)
如果回调还必须访问实际步进器实例的成员,那么,没有。
this
参数传递给回调(公共API通常使用像void* user_data
这样的“不透明”参数)std::function<void(T)>
(或boost::function<...>
)。演示:
<强> Live On Coliru 强>
#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)
我的感觉是类型擦除正是你所寻找的,看到更有启发性的答案: