使用boost :: function和boost :: bind确定函子中的对象和方法

时间:2009-03-23 15:02:56

标签: c++ boost-bind

我想获取指向对象的指针,并指示仿函数将使用boost :: function和boost :: bind构造的仿函数调用哪种方法。 这将允许我自动确定必须执行哪一组仿函数的顺序。

以下(伪)代码(请参阅 POINTER_OF & METHOD_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...
}

提前致谢!

3 个答案:

答案 0 :(得分:4)

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

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

使用Decorator设计模式,您可以在不更改类的情况下添加额外的行为。这将使用Decorator :: DoIt扩展myClassA :: DoIt。

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

答案 1 :(得分:0)

不,我不认为你可以获得设置为增强绑定的增强功能的目标(即METHOD_OF)。根据boost邮件列表中的this post,这是因为没有正式指定bind的返回类型。

修改:链接到与此问题相关的早期问题:demote-boostfunction-to-a-plain-function-pointer

答案 2 :(得分:0)

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::bind的{​​{1}})的实现细节可能会让您了解如何有选择地测试function_equal_impl参数的子集。

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