NS3的Callback例子講解


以ns-3.25/ex1/examples下面的main-callback.cc爲例,講解Callback用法。

#include "ns3/callback.h"
#include "ns3/assert.h"
#include <iostream>

using namespace ns3;

static double
CbOne (double a, double b)
{
  std::cout << "invoke cbOne a=" << a << ", b=" << b << std::endl;
  return a;
}

/** Example Callback class. */
class MyCb {
public:
  /**
   * Example Callback class method.
   *
   * \param [in] a The argument.
   * \returns -5
   */
  int CbTwo (double a) {
    std::cout << "invoke cbTwo a=" << a << std::endl;
    return -5;
  }
};


int main (int argc, char *argv[])
{
  // return type: double
  // first arg type: double
  // second arg type: double
  Callback<double, double, double> one;
  // build callback instance which points to cbOne function
  one = MakeCallback (&CbOne);
  // this is not a null callback
  NS_ASSERT (!one.IsNull ());
  // invoke cbOne function through callback instance
  double retOne;
  retOne = one (10.0, 20.0);
  // callback returned expected value
  NS_ASSERT (retOne == 10.0);

  // return type: int
  // first arg type: double
  Callback<int, double> two;
  MyCb cb;
  // build callback instance which points to MyCb::cbTwo
  two = MakeCallback (&MyCb::CbTwo, &cb);
  // this is not a null callback
  NS_ASSERT (!two.IsNull ());
  // invoke MyCb::cbTwo through callback instance
  int retTwo;
  retTwo = two (10.0);
  // callback returned expected value
  NS_ASSERT (retTwo == -5);

  two = MakeNullCallback<int, double> ();
  // invoking a null callback is just like
  // invoking a null function pointer:
  // it will crash.
  //int retTwoNull = two (20.0);
  NS_ASSERT (two.IsNull ());

#if 0
  // The below type mismatch between CbOne() and callback two will fail to 
  // compile if enabled in this program.
  two = MakeCallback (&CbOne);
#endif

#if 0
  // This is a slightly different example, in which the code will compile
  // but because callbacks are type-safe, will cause a fatal error at runtime 
  // (the difference here is that Assign() is called instead of operator=)
  Callback<void, float> three;
  three.Assign (MakeCallback (&CbOne));
#endif

  return 0;
}

首先我們觀察到第一個Callback與Cbone有這樣的關係:

這裏寫圖片描述

如果這個函數和Callback函數有相同的函數參數類型,那麼我們可以把這個函數綁定爲Callback函數。Callback函數第一個參數是返回類型,後邊的是參數類型。

Callback只是一個聲明的作用,它表示我們綁定任意符合要求的函數到Callback函數,那麼我們究竟要綁定哪個函數呢?接下來我們用MakeCallback函數綁定到具體的函數上去。

// build callback instance which points to cbOne function
one = MakeCallback (&CbOne);

接下來:

NS_ASSERT (!one.IsNull ());


這句話爲了保證Callback爲非空,也就是說,Callback綁定到了特定的函數。

第二次調用Callback函數,是綁定到了類的成員函數上,原理一樣。

我們可以看一下Callback函數和MakeCallback原型

這裏寫圖片描述


參數:
memPtr Class method member pointer
objPtr Class instance


返回:
A wrapper Callback

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章