【发布时间】:2021-02-28 10:21:03
【问题描述】:
我正在尝试编写一个模板来测量任何函数的执行时间:
template<typename Func, typename... Args>
void measure(const Func& f, Args... args);
我有一个带有默认参数compare的模板函数:
template<typename T, typename Compare = std::function<bool(T, T)>>
void mergeSort(std::vector<T>& v, const Compare& compare = std::less<T>());
然后我尝试像这样测量排序时间:
std::vector<int> v = { 3, 5, 7, 8, 3, 24, 7, 2, 8, 0, 8 };
measure(mergeSort<int>, v);
但出现编译错误:'Func (__cdecl &)': too few arguments for call。
运行这个:
std::vector<int> v = { 3, 5, 7, 8, 3, 24, 7, 2, 8, 0, 8 };
measure(mergeSort<int>, v, std::less<int>());
一切正常。 有没有办法让第一个版本可行?
【问题讨论】:
-
建议:设为
void measure(const Func& f, Args&&... args),以便完美转发:f(std::forward<Args>(args)...); -
它没有帮助。同样的错误仍然存在
-
它不能修复错误。只是对代码进行一点改进的建议。
-
无法重现(使用 clang++ 和 g++)您的错误(调用
measure(mergeSort<int>, v);)。你确定你已经加入了<functional>? -
是的,我已经包含了
<functional>和<algorithm>甚至
标签: c++ templates c++17 variadic-templates default-arguments