天天看點

NS-3 中 Callback與MakeCallback的簡單說明

Callback 與  MakeCallback是成對出現的。

1. Callback

http://www.nsnam.org/doxygen/classns3_1_1_callback.html

個人了解: Callback其實類似于“指向函數的指針"

Callback模闆類: Callback< R, T1, T2, T3, T4, T5, T6, T7, T8, T9 >

其中 R為Callback的傳回類型,必選

T1...T9是Callback的實參,可選,預設值為empty

2. MakeCallback

http://www.nsnam.org/doxygen/group___make_callback.html

template<typename T , typename OBJ , typename R , typename T1 >

Callback< R, T1 > ns3::MakeCallback (R(T::*)(T1)      mem_ptr,    OBJ      objPtr)     

模闆類MakeCallback的傳回值為Callback類型

mem_ptr: class method member pointer

objPtr:  class instance

傳回值: a wrapper Callback Build Callbacks for class method members which takes one argument and potentially return a value.

3. 一個簡單的例子:

   typedef Callback<void, Ptr<Vehicle>, std::string, Ptr<const Packet> > DeviceTraceCallback;    //在類外定義

private:

   DeviceTraceCallback m_devTxTrace;

public:

   DeviceTraceCallback GetDevTxTraceCallback() {return m_devTxTrace;}

   void SetDevTxTraceCallback(DeviceTraceCallback devTxTrace) {  m_devTxTrace = devTxTrace; }

protected:

   void DevTxTrace (std::string context, Ptr<const Packet> p) { m_devTxTrace(Ptr<Vehicle>(this), context, p);}

實作:

   std::ostringstream oss;

   oss << "/NodeList/" << m_node->GetId()<< "/DeviceList/0/Mac/MacTx";

    Config::Connect (oss.str(), MakeCallback (&Vehicle::DevTxTrace, this));

繼續閱讀