问题描述
template<typename Func,typename... Args>
void measure(const Func& f,Args... args);
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,2,8 };
measure(mergeSort<int>,v);
但得到编译错误:'Func (__cdecl &)': too few arguments for call
。
运行:
std::vector<int> v = { 3,v,std::less<int>());
一切正常。 有没有办法让第一个版本可行?
解决方法
使用单个参数将函数包装在 lambda 中:[](auto &vec){mergeSort<int>(vec);}
。
此外,typename Compare = std::function<bool(T,T)>
也是一个坏主意,因为 std::function
中的类型擦除有一些开销。您应该只使用 std::less<T>
作为类型。