如何解决具有参数包或初始化程序列表的c ++ 20个视图
我想对函数采用可变数量的参数,然后查看它们。我需要对每个应用多个功能。我一直试图使它与参数包和初始化程序列表一起使用。这些解决方案为什么不起作用,有什么办法可以做到?
理想情况下,最终功能将如下所示:
template <typename some_way_of_taking_multiple_arguments>
void foo(some_way_of_taking_multiple_arguments bar) {
using namespace std::views;
auto data = bar | transform(func1) | transform(func2);
other_func();
data | transform(func3);
}
当我尝试这样调用函数:foo({arg1,arg2,arg3})时,它无法推断出模板类型。
解决方法
只要所有参数的类型相同,就可以像这样构造initializer_list
:
void foo(auto ... bar_args)
{
using namespace std::views;
std::initializer_list bar{bar_args...}; // uses CTAD to deduce type
auto data = bar | transform(func1) | transform(func2);
data | transform(func3);
}
并像这样调用它:
int main()
{
int a=1,b=2,c=3,d=4;
foo(a,b,c,d);
}
这里是demo。
,template<class T,std::size_t N>
void foo( T const(& arg)[N] ) {
for( auto x : arg )
std::cout << x;
}
可以这样称呼:
foo( {1,2,3} );
一个数组可以很好地处理c++20个视图。
,我发现执行此操作的一种方法是将参数类型设置为std :: initializer_list,然后更改行:
data | transform(func3);
至:
for (const auto &datum: data) {func3(datum);}
这是因为func3的返回类型为空,您只能将std :: views :: transform与返回某些内容的函数一起使用。
演示here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。