【问题标题】:Determine object and method in a functor using boost::function and boost::bind使用 boost::function 和 boost::bind 确定仿函数中的对象和方法
【发布时间】:2009-03-23 15:02:56
【问题描述】:

我想获得指向该对象的指针,以及该函子将从使用 boost::function 和 boost::bind 构造的函子中调用的方法的指示。 这将允许我自动确定必须执行哪些函子的顺序。

以下(伪)代码(请参阅 POINTER_OFMETHOD_OF)显示了我正在尝试做的事情:

class myClassA
{
  public:
    DoIt(int i) { return i+i; }
};

class myClassB
{
  public:
    DoItToo(double d) { return d*d; }
};

typedef boost::function0<int> Functor;

myClassA classA;
myClassB classB;

Functor funcA = boost::bind( &myClassA::DoIt, &classA, 10 );
Functor funcB = boost::bind( &myClassB::DoItToo, &classB, 12.34 );

// Create a vector containing some functors and try to determine the objects
// they are called upon and the methods they invoke
std::vector<Functor> vec;
vec.push_back( funcA );
vec.push_back( funcB );

for (int i = 0; i < vec.size();i++)
{
  if (POINTER_OF(vec[i]) == &classA)
  {
    // This functor acts on classA
    if (METHOD_OF(vec[i]) == &myClassA::DoIt)
    {
      // This functor calls the 'DoIt' method.
    }
    else if (METHOD_OF(vec[i]) == &myClassB::DoItToo)
    {
      // This functor calls the 'DoItToo' method.
    }
  }
  // etc...
}

提前致谢!

【问题讨论】:

  • 你写的代码看起来很难看。对不起。请描述更多信息,你想对指针和方法的信息做什么?
  • 一些风格建议,重命名“classA”——它不是一个类,它是一个对象,它是一个特定类的实例。 “instanceA”就可以了; “instanceOfClassA”特别冗长,但至少是准确的。

标签: c++ boost-bind


【解决方案1】:

我知道以下不是对您问题的严格回答,但是。

不要这样做。 改用多态性。这是我在当前项目代码中看到的最奇怪的事情之一:如果函数指针指向“someFunction” - 做一些额外的操作。

您可以使用装饰器设计模式添加额外的行为,而无需过多地更改您的类。这将使用 Decorator::DoIt 扩展您的 myClassA::DoIt。

http://en.wikipedia.org/wiki/Decorator_pattern

【讨论】:

  • 也许我的例子不清楚 ;-) 我只需要确定一个大型仿函数列表调用的对象和方法,以确定方法的执行顺序,因为它们都有边-影响和相互依赖(用于机器控制 - 对象代表物理系统)
  • @lasser - 这并没有改变 Mykola 回答的良好意义。您需要一个具有优先级和功能的对象列表。
【解决方案2】:

不,我认为您无法获得设置为提升绑定(即 METHOD_OF)的提升函数的目标。根据 boost 邮件列表中的this post,这是因为没有正式指定 bind 的返回类型。

编辑:链接到与此问题有些相关的较早问题:demote-boostfunction-to-a-plain-function-pointer

【讨论】:

    【解决方案3】:

    boost::function 对象是相等可比的,所以你应该能够做类似的事情

    if (vec[i] == boost::bind( &myClassA::DoIt, &classA, 10 ))
    {
       // ... this Functor calls DoIt on classA with argument 10
    }
    

    我怀疑您正在寻找更通用的东西。深入了解boost/function_equal.hpp(即boost::bindfunction_equal_impl)的实现细节可能会让您了解如何选择性地测试boost::bind 参数的子集。

    但我真的认为你最好使用基于多态的解决方案,或者只是用一些元数据聚合函数对象。

    【讨论】:

    • 感谢您的评论,蒂姆迪。如果我理解正确,当我使用 equal_impl 时,我仍然会面临从 boost::bind 中获取对象和方法的问题......比较 boost::bind 实例也不起作用,因为当不同的参数传递时它们是不同的.
    • 相等性测试实现本身必须能够访问对象和方法(以比较它们),这就是为什么我建议查看它们是如何实现的。
    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多