※アバウトすぎる質問タイトルについて:
以下の質問内容を適切に表現するタイトルが思いつかないため,仮のものになっています.「こうすべき」という良いタイトル案があればご指摘頂きたく.
なんとなく,このようなコード↓を書きました.
C++
1//T と,Tのメソッドの 2// 戻り値の型 : RetType 3// 引数の型 : ArgType 4// メソッド名 : Method 5//を 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 Test 3{ 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 );
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/04/26 09:06 編集
2024/04/30 03:43 編集
2024/04/30 04:59
2024/05/02 02:47