2

我在这里读到了 boost:bind 的工作原理,尤其是它——除了其他东西——会产生这样的东西:

struct unspecified_type
{
  ... some members ...
  return_type operator()(int i) const { return instance->*&klass::member(0, i);
}

现在,我正在寻找允许向实例指针添加额外间接的东西,以便它最终看起来像这样:

struct unspecified_type
{
  ... some members ...
  return_type operator()(int i) const { return (*p_instance)->*&klass::member(0, i);
}

并且可以像这样使用

MyClass* pmc;
auto mfp = boost::bind(&MyClass::some_func, &pmc);
pmc = new MyClass();
mfp();
pmc = new MyClass();
mfp();
4

2 回答 2

2

您可以使用std::bindandstd::ref或它们的 boost 等效项(但由于您使用的是 C++11,因此您可能希望使用标准类和函数)。所以给定这个类:

#include <iostream>

struct MyClass
{
    int x;
    MyClass(int x_) : x(x_) { }
    void some_func()
    {
        std::cout << x << std::endl;
    }
};

您可以传递要在其上调用成员函数的指针,该指针包含在std::reference_wrapper. 此外,避免使用new(和delete!)并更喜欢使用智能指针来建模对象所有权:

#include <functional>
#include <memory>

int main(int argc, char *argv[])
{
    std::shared_ptr<MyClass> pmc;
    auto mfp = std::bind(&MyClass::some_func, std::ref(pmc));

    pmc = std::make_shared<MyClass>(42);
    mfp();

    pmc = std::make_shared<MyClass>(1729);
    mfp();
}

这是一个活生生的例子

于 2013-05-17T12:16:22.343 回答
0

从技术上讲,您可以使用函数扩展boost::bind(但不能):std::bindget_pointer

#include <boost/bind.hpp>
struct MyClass
{
  void some_func()
  {}
};

namespace boost
{
  template<class T>
  T *get_pointer(T **t)
  {
    return *t;
  }
}

int main()
{
  MyClass *pmc;
  auto mfp = boost::bind(&MyClass::some_func, &pmc);
  pmc = new MyClass();
  mfp();
  pmc = new MyClass();
  mfp();
}
于 2013-05-17T12:42:22.543 回答