是否可以简化这些C ++模板参数?

时间:2012-06-28 10:54:23

标签: c++ templates

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

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> 

2 个答案:

答案 0 :(得分: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))

不......这要短得多......但它确实避免了冗余。

答案 1 :(得分: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
   }
};