2

次のパラメーターを持つテンプレート クラスがあります。

template <class TObj, class TMsg, void (TObj::*TMethod)( TMsg*, Link*)>
class Slot : ...

このクラスをインスタンス化するときは、次のように記述する必要があります

Slot<MyObject, MyMessage, MyObject::myMethod> 

これは、クラス MyObject に myMethod という名前のメソッドがあり、MyMessage* が最初の引数であることを意味します。

少なくとも MyObject クラスを 1 回だけ指定できるように、Slot クラスのインスタンス化を単純化する方法はありますか?

メソッドの後に TMsg 型を指定できると、より直感的になります。次のようなもので問題ありません。

Slot<MyObject::myMethod, MyMessage> 
4

2 に答える 2

1

使用decltypeがオプションの場合...

template <typename M, typename O, void (O::*Method)(M*, Link*)>
Slot<O, M, Method> slot_type(Method);

その後:

decltype(slot_type<MyMessage>(MyObject::mymethod))

ではありません...これははるかに短いです...しかし、冗長性は回避されます。

于 2012-06-28T11:18:57.333 に答える
0

スロット ハンドラーに渡されるoperator() すべてのパラメーター タイプ (TMsgおよび) のペアをオーバーロードできます。Link

struct MyObject
{
   //handlers
   void operator()(AMsg* msg, Link* link);  //handler 1
   void operator()(BMsg* msg, Link* link);  //handler 2
   void operator()(CMsg* msg, Link* link);  //handler 3
};

そして、次のように使用します。

Slot<MyObject, AMsg> aslot;
Slot<MyObject, BMsg> bslot;
Slot<MyObject, CMsg> cslot;

あなたSlotの場所:

template <class TObj, class TMsg>
class Slot 
{
   TMsg *pMsg;
   Link *pLink;
   void f()
   {
      TObj slotHander;

      slotHandler(pMsg, pLink); //it calls the appropriate handler
   }
};
于 2012-06-28T11:12:02.757 に答える