【问题标题】:C++ variadic tempates with default argument具有默认参数的 C++ 可变参数模板
【发布时间】:2021-02-28 10:21:03
【问题描述】:

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

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 &amp;)': 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>());

一切正常。 有没有办法让第一个版本可行?

【问题讨论】:

  • 建议:设为void measure(const Func&amp; f, Args&amp;&amp;... args),以便完美转发:f(std::forward&lt;Args&gt;(args)...);
  • 它没有帮助。同样的错误仍然存​​在
  • 它不能修复错误。只是对代码进行一点改进的建议。
  • 无法重现(使用 clang++ 和 g++)您的错误(调用 measure(mergeSort&lt;int&gt;, v);)。你确定你已经加入了&lt;functional&gt;
  • 是的,我已经包含了&lt;functional&gt;&lt;algorithm&gt; 甚至

标签: c++ templates c++17 variadic-templates default-arguments


【解决方案1】:

使用单个参数将函数包装在 lambda 中:[](auto &amp;vec){mergeSort&lt;int&gt;(vec);}

另外,typename Compare = std::function&lt;bool(T, T)&gt; 是个坏主意,因为 std::function 中的类型擦除有一些开销。您应该只使用 std::less&lt;T&gt; 作为类型。

【讨论】:

    猜你喜欢
    • 2019-09-12
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多