2

假设我有一些这样的代码:

class Visitor {
   public:
      Visitor(callBackFunction) {}
      void visit() {
          //do something useful
          invokeCallback();
      }
}

class ClassThatCanBeVisited {
    Visitor &visitor;

    public:
       ClassThatCanBeVisited(Visitor &_visitor) : visitor(_visitor){}
       void someUsefulMethod() {
          int data= 42;
          visitor.visit(data);
       }
};


void callBackFunction() {
    //do something useful in the context of the Main file
}
int main() {
     Visitor visitor;
     ClassThatCanBeVisited foo(visitor);
     foo.someUsefulMethod();
}

我需要创建一个简单的回调,只要调用 Visitor::visit() 就会调用该回调。我知道我可能应该将回调的代码放在我的访问者中,但它在不同的上下文中,所以我想将 callBackFunction() 传递给访问者,以便他可以调用我的回调函数。

我在网上找了东西,看到了 boost::function,但是 c++ 已经有了基本的仿函数。

为了使代码更清晰,我应该使用哪一个?回调将是一个简单的 void() 函数,但它可能会增长,你永远不知道未来 :)

推荐的方法是什么?

4

3 回答 3

7

是的 boost::function 会做得很好。这是它的一个非常常见的用法。您将需要使用 boost::bind 将实例绑定到成员函数。

 func = boost::bind( &MyClass::CallbackFunc, this);

将是您在课堂上如何做到这一点。

确保“this”不会消失,否则你的 boost 函数会在某个 boost header 的中间崩溃。

于 2009-03-04T18:43:09.960 回答
4

如果您不想使用 boost::function,可以使用回调接口及其层次结构。

class VisitorCallback
{
public:
    virtual void handle( const Visitor& ) = 0;
};

如果您有或可以使用 boost::function - 使用它,这是摆脱所有这些回调类的好方法。

编辑:
@edisongustavo:

boost::function 和 boost::bind 可能不会使您的代码更具可读性。但它会让你有机会将自由函数(我的意思是类外函数和静态类函数)作为回调以及任何类的现有函数传递。

使用 boost 函数,您可以将具有例如 2 个参数的函数作为回调传递,而回调函数只需要一个参数。

typedef boost::function< void ( int ) > IntExpectingCallback;

void TwoIntFunction( int, int );
{
}
...
IntExpectingCallback callback = boost::bind( TwoIntFunction, 5, _1 );

但是同样,除非您的所有团队都知道并支持提升,否则这不会使您的代码更具可读性。

于 2009-03-04T18:45:37.130 回答
1

上面的答案很好,但我只想指出您在问题中提到的一些内容,这仍然与您在 C++ 回调对象(在 Mykola 的答案中)和 boost 之间的选择有关。

“回调将是一个简单的 void() 函数,但它可能会增长,你永远不知道未来 :)”

这可能是额外的、不必要的功能的最糟糕的原因——即“以防万一你需要它”。如果你不知道——那么不要做超出必要的事情,你的猜测很可能是错误的,尤其是在你需要的时候。

另一方面,如果您确实知道很可能很快就会需要该功能,那么可能值得添加它。

再次重申 Mykola 所说的话——如果你的项目已经有了提升并且你的团队喜欢它,那么就使用它,否则它可能是矫枉过正的。

于 2009-04-23T07:28:13.437 回答