带有默认参数的 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,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> 作为类型。