あなたがやりたいことは、可変個引数テンプレートで解決できると思います。
http://www.cplusplus.com/articles/EhvU7k9E/
基本的に、引数リストを外側の std::function から内側に「転送」できます。
編集:
以下に、可変個引数テンプレートの概念を使用した最小限の作業例を追加しました。では、内部ラムダ関数に指定されたパラメータを使用してmain(...)
、ラムダ関数が別のオブジェクトにラップされます。std::function
これは、測定する関数をパラメーターとしてテンプレート化された関数に渡すことによって行われますmeasureTimeWrapper
。渡された関数と同じシグネチャを持つ関数を返します (のテンプレート引数でそのラムダのパラメーター リストを適切に定義した場合measureTimeWrapper
)。
実行時間が測定される関数は、ここに座って、そのパラメーターで定義されたミリ秒数だけ待機します。それ以外は時間計測には全く関係ありません。これはラッパー関数によって行われます。
この方法では、内部関数の戻り値が失われることに注意してください。値を保持したい場合は、値が返される方法を変更することをお勧めします (おそらく、測定された時間と実際の戻り値を含む構造体として)。
-std=c++11
少なくともコードをコンパイルすることを忘れないでください。
#include <iostream>
#include <cstdlib>
#include <functional>
#include <chrono>
#include <thread>
template<typename T, typename... Args>
std::function<double(Args...)> measureTimeWrapper(std::function<T> fncFunctionToMeasure) {
return [fncFunctionToMeasure](Args... args) -> double {
auto tsStart = std::chrono::steady_clock::now();
fncFunctionToMeasure(args...);
auto tsEnd = std::chrono::steady_clock::now();
std::chrono::duration<double> durTimeTaken = tsEnd - tsStart;
return durTimeTaken.count();
};
}
int main(int argc, char** argv) {
std::function<double(int)> fncMeasured = measureTimeWrapper<void(int), int>([](int nParameter) {
std::cout << "Process function running" << std::endl;
std::chrono::milliseconds tsTime(nParameter); // Milliseconds
std::this_thread::sleep_for(tsTime);
});
std::cout << "Time taken: " << fncMeasured(500) << " sec" << std::endl;
return EXIT_SUCCESS;
}