boost::bind 无法绑定到纯虚拟基类中定义的非静态函数模板成员类型



../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。也

  1. 您显式地将this参数传递到回调中(公共 API 通常使用"不透明"参数,如void* user_data)
  2. 或者创建一个函数对象,例如使用 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 相同类型但具有不同尺寸

最新更新