[英]Use forwarded arguments in templated function to execute function with default parameters
我有一个模板化的 function auto Run(Func f, Args&&... args)
可以接受 variadig arguments 和一个 function 来执行。
If the function I want to execute has default arguments set, I cannot use this function for my Run
function whithout specifying every argument on its own. 请参见下面的示例:
#include <functional>
template<typename Func, typename ...Args>
auto Run(Func f, Args&&... args)
{
return f(std::forward<Args>(args)...);
}
int Int(int a, int b = 2){ return a + b; }
int main()
{
Run(Int, 3, 2); // does compile, because every parameter is set
Run(Int, 3); // does not compile
}
有没有一种方法可以在不改变我如何调用 function 的情况下实现两者? 我只想在可能的情况下更改模板化 function
一种可能的解决方案(从 C++14 开始)是将Int()
function 包装在通用 lambda 中
Run([](auto && ... as)
{ return Int(std::forward<decltype(as)>(as)...); }, 3, 2);
Run([](auto && ... as)
{ return Int(std::forward<decltype(as)>(as)...); }, 3);
这样编译器直接管理Int()
function 的调用,保持第二个参数的默认值的知识并使用它。
问题是参数默认值不是函数签名的一部分,因此以下函数
int Int_0 (int a, int b){ return a + b; }
int Int_1 (int a, int b = 2){ return a + b; }
int Int_2 (int a = 1, int b = 2){ return a + b; }
是具有相同签名的 function ,因此属于相同类型( int(int, int)
)。
如果您将Int_2()
传递给 function 接受int(int, int)
或推断为int(int, int)
的模板参数(如在您的Run()
情况下),则默认值是宽松的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.