1

私は簡単なプロファイル機能を実装しています:

template <typename T>
typename T::return_type ProfilerRun(T&& func, const std::string& routine_name = "unknown" )
{
    using std::chrono::duration_cast;
    using std::chrono::microseconds;
    using std::chrono::steady_clock;
    using std::cerr;
    using std::endl;
#ifdef SELF_PROFILING
    steady_clock::time_point t_begin = steady_clock::now();
#endif
    func();
#ifdef SELF_PROFILING
    steady_clock::time_point t_end = steady_clock::now();
    cerr << "Function " << routine_name << " duration: " <<
         duration_cast<microseconds>( t_end - t_begin ).count() <<
         " microseconds." << endl;
#endif
}

これは で完全に機能しますが、生の関数ポインタにはプロパティstd::bind(&Class::function, class_object, param1, param2, ...)がないため機能しません。T::result_type私も考えてみました

auto ProfilerRun(T&& func, const std::string&) -> decltype(T()))

ただし、この場合、関数オブジェクトが配信されたときに のコンストラクターdecltypeが呼び出されます。Tこの問題を解決するための戦略はありますか?

4

1 に答える 1