テンプレートファンクタを作成しようとしていますが、これは引数オブジェクトとメンバ関数として任意の数のパラメータを使用します。私はテンプレートを使ってコードを正しく書く方法を理解できません。任意のパラメータを持つテンプレートファンクタ
template<typename ItemT,
class T,
typename ...Args>
struct Builder
{
ItemT operator()(T& object, ItemT (T::*method)(Args...), Args && ... args)
{
return (object.*method)(std::forward<Args>(args)...);
}
};
struct Object
{
int method(int, int, int) { return 4; }
};
int main()
{
Object obj;
Builder<int, Object>()(obj, &Object::method); // Error here
}
パラメータを指定せずにObject ::メソッドを作成するとコードがコンパイルされます。しかし、パラメータで - いいえ。
重大度コード説明プロジェクトファイルの行抑制状態 エラーC2664 'int型のビルダー::演算子()(T &、ItemT(オブジェクト__thiscall :: *)(無効))':int型から引数2を変換することはできません(__thiscall Object :: *)(int、int、int) 'から' int(__thiscall Object :: *)(void) 'の下書きc:\ drafts \ main.cpp 139
あなたが 'Builder'オブジェクトを宣言したとき、' typename ... Args'は何を定義するために渡すのを忘れましたか? – NathanOliver
あなたは 'Builder'を必要とし、 'Object :: method'が引数として望む3つのintを実際に渡す必要があります。より一般的には、練習のポイントが何であるかは不明です。あなたは本当に解決しようとしている問題は何ですか? –
ネイサンが言ったこと。これはまた、標準ライブラリがオブジェクトを構築するだけのさまざまな "make_ *"フリー関数を提供する理由です。したがって、テンプレート引数の控除が発生する可能性があります。 C++ 1zでは、コンストラクタはクラスのテンプレートパラメータを推定し、コードを有効にすることができます。 – StoryTeller