※アバウトすぎる質問タイトルについて:
以下の質問内容を適切に表現するタイトルが思いつかないため,仮のものになっています.「こうすべき」という良いタイトル案があればご指摘頂きたく.
なんとなく,このようなコード↓を書きました.
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 コメント