2015-11-18 63 views
2

如何將成員函數指針轉發到模板類型參數中。我有以下代碼。將指向成員函數參數的指針傳遞給模板參數

template <typename T, typename ret, typename ...params> 
class lol2 
{ 
    template <ret(T::*memfn)(params...)> 
    void boo() 
    { 
     /* some code here */ 
    } 
}; 

template<typename T, typename ret, typename ... params> 
void foo(ret(T::*memfn)(params...)) 
{ 
    auto test = lol2<T, ret, params...>{}; 
    test.boo<memfn>(); /*error: expected primary-expression before ‘)’ token */ 
} 

我需要能夠將成員函數指針轉發到模板參數。我怎樣才能做到這一點?

謝謝。

+1

它應該是'模板',而不是'模板'?示例中沒有定義任何DerivedType。 – skypjack

+0

是的。感謝您的發現。作出更正 – user2379758

回答

3

在稱爲boo的上下文中是依賴名稱。你需要使用

test.template boo<memfn>(); 

當然,這是不行的,既可以當memfn是運行時間值:如果它是一個常數李毅華,它才能發揮作用。如果您需要處理運行時間值,則需要以某種方式傳遞參數。它可以成爲lol2的成員或boo()的附加參數。

您還需要修復lol2的定義並使用T insted if DerivedType

+0

@TartanLlarma:是的 - 剛剛發佈後發佈(並在評論中的答案)。 –

+0

非常感謝。我完全不熟悉C++。糾正我,如果我錯了,這是否意味着或者類型簽名是const如下, void foo(ret(T :: * memfn)(params ...)const) 因爲我仍然需要推斷它作爲模板參數。我想我可以使它與宏一起工作。無論哪種方式,這是太棒了,謝謝! – user2379758

+0

@ user2379758:儘管'const'是合法的,但它意味着不同的東西(它聲明成員函數被傳遞給const成員,即使它適用於const對象)。使用函數參數作爲模板參數將不起作用:模板參數在編譯時確定,而函數參數值僅在運行時已知。 –

0

請記住,要調用的成員函數必須與對象綁定。 因此,你會以某種方式在通話時傳遞該類的一個對象。此外,你要轉發成員函數指針:

template <typename T, typename ret, typename ...params> 
class lol2 { 
    T &obj; 
public: 
    lol2(T &obj_) : obj(obj_) {} 
    void boo(ret(T::*memfn)(params...), params&&... pars) { 
    (obj.*memfn)(std::forward<params>(pars)...); 
    } 
}; 

template<typename T, typename ret, typename ... params> 
void foo(T &obj, ret(T::*memfn)(params...), params&&... pars) { 
    auto test = lol2<T, ret, params...>(obj); 
    test.boo(memfn, std::forward<params>(pars)...); 
} 

LIVE DEMO

+0

確實,在'boo'中轉發並不是完美的轉發。我錯了嗎? – skypjack

相關問題