2017-07-28 13 views
2

テンプレートtypedefusingで可能です。どのように私は直接テンプレートのメソッドのポインタを作ることができますか?テンプレートポインタをテンプレートメソッドに宣言するにはどうすればいいですか?

例:私はdecltypeせずに、直接使う下線部を書き込むことができますどのように

class MyClass { 

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

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

これまでのところ、私が試してみました:

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のパラメータと同じではありません。テンプレートタイプが署名の一部ではないので、不一致がうまく結合するが、他の目的に利用することができますnontemplated Ptr2も正常に動作する理由でもあります

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

を。

関連する問題