我有一个带有以下参数的模板类
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>
答案 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
}
};