具有默认参数的 C++ 可变参数模板

C++ variadic tempates with default argument

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

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