测量任何功能经过时间的模板

Template that measures elapsed time of any function

我想创建一个模板函数来测量任何其他函数的运行时间。 到目前为止我做了什么:

using TimeDuration = std::chrono::nanoseconds;

std::tuple<FuncReturnType, TimeDuration> measureTime(Func func, Args&&... args)
{
    auto start = std::chrono::high_resolution_clock::now();
    auto ret = func(std::forward<Args>(args)...);
    auto end = std::chrono::high_resolution_clock::now();

    return {ret, std::chrono::duration_cast<TimeDuration>(end - start)};
}

可以调用 auto [ret, duration] = measureTime<FuncType>(Func, args..) 并且有效。

问题是我不知道如何让它在 return void 的函数上工作,因为 auto ret = func(..) 不再有意义了。如果我可以删除 FuncReturnType 参数也很好。

有什么想法吗?谢谢

P.S。我正在使用 C++17,没有提升

你可以这样做:

template <typename Func, typename ...Args>
auto measureTime(Func func, Args&&... args)
{
    using FuncReturnType = decltype(func(std::forward<Args>(args)...));

    const auto start = std::chrono::high_resolution_clock::now();
    if constexpr (std::is_same_v<void, FuncReturnType>) {
        func(std::forward<Args>(args)...);
        auto end = std::chrono::high_resolution_clock::now();
        return std::chrono::duration_cast<TimeDuration>(end - start);
    } else {
        FuncReturnType ret = func(std::forward<Args>(args)...);
        auto end = std::chrono::high_resolution_clock::now();
        return std::tuple<FuncReturnType , TimeDuration>{
            ret, std::chrono::duration_cast<TimeDuration>(end - start)
        };
    }
}