繁体   English   中英

在模板化的 function 中使用转发的 arguments 以默认参数执行 function

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM