C++11 带有函数默认参数值的可变参数

2024-01-03

我有调用模板函数 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

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


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

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

并将其用作

retry_n<10>(functor{}, 1, 2);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 带有函数默认参数值的可变参数 的相关文章

随机推荐