2

我有一个带有以下参数的模板类

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

当我实例化这个类时,我必须写

Slot<MyObject, MyMessage, MyObject::myMethod> 

这意味着 MyObject 类有一个名为 myMethod 的方法,期望 MyMessage* 作为第一个参数。

有没有一种方法可以简化 Slot 类实例化,以便我至少只能指定 MyObject 类一次?

如果可以在方法之后指定 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 回答