【问题标题】:c++11 variadic args with function default argument value具有函数默认参数值的 c++11 可变参数
【发布时间】:2017-08-09 02:59:33
【问题描述】:

我有调用模板函数 N 次的包装器:

template <std::uint16_t N, typename F, typename  ... Args>
inline typename std::result_of<F && (Args &&...)>::type retry_n(F && f, Args&& ... ax)
{
    for (auto i = 0; i < N; ++i)
    {
        try
        {
            return std::forward<F>(f)(std::forward<Args>(ax)...);
        }
        catch (const some_except &e){ /*ignore exception for a while*/ }
    }
    throw;//re-raise
}

在我使用默认参数传递函数之前一切正常:

int f(int a, int b, int c = 5);
.... 
retry_n<10>(f, 1, 2); // error C2198: 'bla-bla' : too few arguments for call

如何允许在没有明确说明的情况下使用默认参数?

【问题讨论】:

  • retry_fn&lt;10&gt;([](auto...x){return f(x...);}, 1, 2)
  • @ᐅJohannesSchaub-litbᐊ 是的,很明显的解决方法

标签: c++11 variadic-templates


【解决方案1】:

默认参数不是函数签名的一部分,也不参与模板类型推导。所以每当你将f 传递给retry_n&lt;&gt; 时,F 的类型就被推导出为int(int, int, int),所以本地的f 就是后一种类型,默认参数现在已经退出进程了。您唯一的解决方案是直接使用要测试的函数而不推断其类型,就像在@Johannes Schaub - litb 的评论中一样,或者,如果您的编译器不支持通用 lambdas (C++14),请将其包装起来变成带有可变参数模板的函子operator()

struct functor
{
    template<typename... T>
    int operator()(T&&... params)
    {
        return f(std::forward<T>(params)...);
    }  
};

并将其用作

retry_n<10>(functor{}, 1, 2);

【讨论】:

  • 感谢您在技术上正确的回答。我在看stackoverflow.com/a/27687037/149818,感觉std::enable_if_t可以在那里应用
  • @Dewfy 嗯,可能是,如果你找到解决方案,请发布答案,这个问题很有趣。
猜你喜欢
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多