代码之家  ›  专栏  ›  技术社区  ›  Gustavo Muenz

我需要在C++中创建一个简单的回调函数吗?我应该使用boost::函数吗?

  •  2
  • Gustavo Muenz  · 技术社区  · 17 年前

    假设我有这样的代码:

    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()传递给访问者,以便他可以调用我的回调函数。

    我在网上找了一些东西,看到了Booo::函数,但是C++已经有了基本的函子。

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

    推荐的方法是什么?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Mykola Golubyev    17 年前

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

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

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

    编辑:
    爱迪生古斯塔沃:

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

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

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

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

        2
  •  7
  •   Doug T.    17 年前

    是的,boost::函数可以很好地做到这一点。这是很常见的用法。您需要使用boost::bind将实例绑定到成员函数。

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

    你在课堂上是怎么做到的。

    确保“这个”不会被破坏,否则你的助推功能会在某个助推头中间的某个地方崩溃。

        3
  •  1
  •   Justicle    16 年前

    上面的答案很好,但是我想指出你在你的问题中提到的一些东西,它仍然与你在C++回调对象(Mykola的答案)和Boost之间的选择相关。

    回调将是一个简单的void()函数,但它可能会增长,您永远不知道将来会是什么样的。

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

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

    再次重复Mykola所说的——如果你已经在你的项目中得到了提升,并且你的团队喜欢它,那么就使用它,否则它可能是多余的。