2017-07-28 132 views
2

模板typedef s可能與using。我怎樣才能直接製作模板化方法指針?如何將模板化指針聲明爲模板化方法?

例子:

class MyClass { 

    template<bool B> void fnc() { /*...*/ }; 

    // Now I can do: 
    template<bool B> 
    using TempPtr = decltype(&MyClass::fnc<B>); 
    //    ^^^^^^^^^^^^^^^^^^^^^^^^^^ 
}; 

我怎麼能寫劃線部分direcly,沒有decltype

到目前爲止,我曾嘗試:

template<bool B> 
using TempPtr = template<bool> void (MyClass::*)(); 

template<bool B> 
using TempPtr = void (MyClass::*<B>)(); 

... 

(後續問題:我能使用TempPtr爲模板,模板參數?)

+0

強制性的「你爲什麼要這樣做」:D無論如何,你確定你需要模板部分的實際成員函數? –

+0

@BartekBanachewicz我正在研究一種新的元編程模式。 – ManuelAtWork

回答

1

那些將工作,讓稍有不同的行爲:

template<bool B> 
using Ptr = void (MyClass::*)(); 

using Ptr2 = void (MyClass::*)(); 

// alternatively 
//typedef void (MyClass::*Ptr2)(); 

要使用:

MyClass::Ptr<true> ptr = &MyClass::fnc<true>; 

MyClass::Ptr2 ptr2 = &MyClass::fnc<true>; 

Ptr中的bool參數與fnc中的參數不同。因爲模板類型不是簽名的一部分,不匹配會結合得很好,但可以用於其他目的:

MyClass::Ptr<false> ptr = &MyClass::fnc<true>; 

這也是爲什麼nontemplated Ptr2也能正常工作。