我正在尝试编写一个模板,将测量任何函数的执行时间:
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>());
都能正常工作。是否有办法使第一个版本可行?
将函数封装在一个lambda中,只有一个参数:[](auto &vec){mergeSort<int>(vec);}
。
同样,typename Compare = std::function<bool(T, T)>
也是一个坏主意,因为std::function
中的类型擦除有一些开销。您应该使用std::less<T>
作为类型。