2012-06-28 78 views
2

我有以下參數模板類是否可以簡化這些C++模板參數?

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

正在使用'MyObject :: operator()'選項嗎? – bitmask

+0

否,因爲MyObject中可能有不同的方法,我們要爲其創建一個槽。方法名稱及其消息類型非常重要,因爲C++中的重載是合法的。然而,Link *參數總是存在於方法和基類中。 – chmike

+0

@chmike:你可以用許多實現來重載'()',每個實現都有不同的參數集。看到我的答案。 – Nawaz

回答

0

可以重載operator()所有對參數類型(TMsgLink)的傳遞到時隙處理器。

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 
    } 
}; 
+0

毫無疑問,它是有效的,但它不回答這個問題。該對象只能有一個void操作符()(AMsg * msg,Link * link)方法。除此之外,消息多態會產生編譯器可能窒息的歧義。 – chmike

+0

@chmike:不。對象可以有任意多個'operator()',就像我的例子。 – Nawaz

+0

我需要的是用戶可以在同一個類中定義method1(AMsg *){},method2(AMsg *){},...併爲這些方法中的每一個定義特定的槽成員變量。每種方法當然會有特定的行爲。這就是爲什麼使用operator()不是一個選項。 – chmike

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)) 

不......這個要短得多......但它確實避免了冗餘。

+0

我不確定這會起作用。槽是一個類,而不是一個功能。它用於定義一個成員變量類型,使它成爲模板參數中定義的方法的連接點。插槽 m_mySlotMemberVariable; – chmike

相關問題