この関数の関数ポインタと引数を格納できるテンプレートクラスを作成して、この引数で関数を後で呼び出せるようにしたいと考えています。バリデーションテンプレート引数を使用して可変数の引数を保存する方法は?
私はこれを普遍的に書いており、引数の型や番号には依存しません。私はそれが可能であれば安全に、このクラスタイプの少なくともパブリックインターフェイスを持っていると思い
template<class T, typename... Params>
class LazyEvaluation {
private:
// Function to be invoked later
T (*f)(Params...);
// Params for function f
Params... storedParams; // This line is not compilable!
bool evaluated;
T result;
public:
// Constructor remembers function pointer and parameters
LazyEvaluation(T (*f)(Params...),Params... params)
: f(f),
storedParams(params) //this line also cannot be compiled
{}
// Method which can be called later to evaluate stored function with stored arguments
operator T&() {
// if not evaluated then evaluate
if (! evaluated) {
result = f(storedParams...);
evaluated = true;
}
return result;
}
}
:ここ
は、C++ 11の可変長引数テンプレートを使用してアイデアのscatchです。この仕事を少なくとも何とかすることが重要です。
私は何とか可変数の引数を保存することができました。しかし、私は関数fにそれらを渡すことができませんでした。私はそれを答えに書いていきますが、あなたが私の醜い作業ではない試みを見る前に、自分の解決策について考えてください。
私は、上記のコードをMicrosoft Visual C++ Compiler 11月2012 CTP(v120_CTP_Nov2012)でコンパイルしていますが、コンパイラに依存しないソリューションがあれば最適です。
parametrパックがrecursivle拡大することができ、各parametrが保存:
はここ
私はこれが重複していると思います:http://stackoverflow.com/questions/14833129/a-clean-way-to-store-a-function-and-its-arbitrary-type-arbitrary-number-argum – hmjd
それらを 'std :: tuple'に保存してください... –
kennytm
@KennyTMこれは答えになるはずです。 – Angew