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

时间:2017-04-13 06:02:19

标签: c++ function c++11 boost callback

../ 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); //
 }
}

甚至可能吗?它只是一个伪代码

1 个答案:

答案 0 :(得分:1)

如果回调还必须访问实际步进器实例的成员,那么,没有。

  1. 你明确地将this参数传递给回调(公共API通常使用像void* user_data这样的“不透明”参数)
  2. 或创建一个功能对象,例如使用lambda,boost :: bind,std :: bind或手动。函数对象可以保持状态。标准库和boost具有用于此类回调的类型擦除容器: std::function<void(T)> (或boost::function<...>)。
  3. 演示:

    <强> 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)
    

    我的感觉是类型擦除正是你所寻找的,看到更有启发性的答案:

相关问题