带有默认参数的c++变量模板



我正在尝试编写一个模板,将测量任何函数的执行时间:

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>作为类型。

最新更新