具有默认参数的 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>
作为类型。
我正在尝试编写一个模板来测量任何函数的执行时间:
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>
作为类型。