template の書き方

※アバウトすぎる質問タイトルについて:
以下の質問内容を適切に表現するタイトルが思いつかないため,仮のものになっています.「こうすべき」という良いタイトル案があればご指摘頂きたく.


なんとなく,このようなコード↓を書きました.

C++

1//T と,Tのメソッドの2// 戻り値の型 : RetType3// 引数の型 : ArgType4// メソッド名 : Method5//を template引数とする.6template<7 class T, class RetType, class ArgType,8 RetType (T::*Method)(ArgType)9>10class XXX 11{12public:13 RetType CallTheMethod( T &t, ArgType arg )14 { return (t.*Method)( arg ); }15};

これを使うテストコードは,例えばこんな↓です.

C++

1//何かてきとーにこんなclassがあるとして…2struct Test3{4 void F( int i ){ std::cout << i << "\n"; }5};6 7//こんなコードを書くと,8// t.F(33);9//という呼び出しが実施される.10Test t;11XXX<Test, void, int, &Test::F > xxx;12xxx.CallTheMethod( t, 33 );

ここまでは良いのですが,
ここで,メソッドの引数を複数個にしたい,すなわち,上記 template の class ArgType のところを,class ...Args のようにしたいのですが,その方法がわかりません.

意味合い的にはこんな↓なのですが…

C++

1template<2 class T, class RetType, class ...Args, //← ArgType を ...Args に変更3 RetType (T::*Method)(Args...) //← Method の引数を Args にしたい4>5class XXX2 6{7public:8 RetType CallTheMethod( T &t, Args... args )9 { return (t.*Method)( args... ); }10};

これではコンパイルが通りません.
可変長のArgs は末尾である必要があるため,↓のコンパイルエラーとなります.

error C3525: 'Args': クラス テンプレートにテンプレート パラメーター パックが含まれている場合、そのパラメーター パックはテンプレート パラメーター リストの最後に指定する必要があります

しかしながら,Args が先に無いと,RetType (T::*Method)(Args...) を書くことができないので困っています.
このような場合,どうすれば良いのでしょうか?


[追記] 自分で試したこと:

こんなことをすれば↑のコンパイルエラーから逃げることはできそうですが,無理矢理感というか… もっとやりようがあるのではないだろうか? と…

C++

1template< class T, class RetType, class ...Args >2class XXX2Outer 3{4public:5 template< RetType (T::*Method)( Args... ) >6 class XXX2Inner 7 {8 public:9 RetType CallTheMethod( T &t , Args... args )10 { return (t.*Method)( args... ); }11 };12};13 14//15XXX2Outer<Test, void, int>::XXX2Inner< &Test::F > xxx2;16xxx2.CallTheMethod( t, 33 );

コメントを投稿

0 コメント