我有调用模板函数 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(使用前将#替换为@)