【问题标题】:Replacing boost::function and boost::bind with Templates用模板替换 boost::function 和 boost::bind
【发布时间】:2018-01-30 10:51:37
【问题描述】:

我正在尝试从我的代码中删除 boost 库。 我没有 std::function,我正在使用 C++98,而不是 C++11。我仍然需要存储来自不同类的简单void Funcs() 向量。

我正在使用一个简单的模板来获取类和函数的实例。 但我想替换对 boost::function 和 boost::bind 的需求。

class App
{
public:
   App();

   template<class T>
   static void AddLoopFunc(void (T::*func)(), T* instance)
   {
       loop_funcs.push_back(boost::bind(func, instance));
   }

   static std::vector< boost::function<void()> > loop_funcs;
};

在循环中添加一个函数

App::AddLoopFunc(&MyClass::Loop, this);

【问题讨论】:

  • this 是什么?此电话来自 withing MyClass ?请提供minimal reproducible example
  • 为什么要移除 boost 库?
  • 您最终会得到近似于bindfunction 的东西(专业化)。除非您的问题与 the license boost 使用有关,否则您可以从适当的标题创建派生作品并使用它
  • 只是对一个老问题的更新,但 C++11 STL 现在完全支持 std::function 和 std::bind。大多数编译器都兼容 C++11,并且可以轻松替换 boost::function 和 boost::bind 对应的编译器。

标签: c++ templates function-pointers c++03 boost-function


【解决方案1】:

让我们为具有给定签名的任何类的成员函数制作一些类型擦除适配器。

struct dummy
{
    void func() {};
};

typedef void (dummy::*dummyfunc)();

template <class Obj>
void adapt_ptr_mem_func_0(void* obj, dummyfunc func)
{
    void (Obj::*realfunc)() = reinterpret_cast<void (Obj::*)()>(func);
    Obj* realobj = reinterpret_cast<Obj*>(obj);
    (realobj->*realfunc)();
}

你可以用 this 调用 any 类的指向成员函数的指针。不是以类型安全的方式,但我们稍后会将其隐藏在类型安全的商店前面。

class callback
{
    void (dummy::*func)();
    void* obj;
    void (*adaptor)(void*, void (dummy::*)());
  public:
    template <class Obj>
    callback(Obj* obj, void (Obj::*func)(void)) :
        obj(obj), func(reinterpret_cast<dummyfunc>(func)),
        adaptor(adapt_ptr_mem_func_0<Obj>) {}

    void operator()()
    {
        adaptor(obj, func);
    }
};

callback 构造函数接受对象obj_ 和指向成员函数的指针func_,并创建一个类型擦除的函数对象,该对象在调用时会调用(obj-&gt;*func)()

测试:

struct Moo
{
    int m;
    Moo (int m) : m(m) {};
    void doit() { std::cout << m << "\n"; }
};

int main()
{
    Moo moo(42);
    callback c(&moo, &Moo::doit);
    c();
};

【讨论】:

    【解决方案2】:

    boost::functionboost::bind 在 C++98 中可用,无需替换。

    【讨论】:

    • Op 正在尝试“从我的代码中删除 boost 库”
    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2012-09-27
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多