带有参数包或初始化列表的 c++20 视图

c++20 views with parameter pack or initialiser list

我想将可变数量的参数传递给一个函数,然后查看它们。我需要对每个函数应用多个函数。我一直试图让它与参数包和初始化列表一起使用。为什么这些解决方案不起作用,有什么办法可以做到这一点?

理想情况下,最终函数如下所示:

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}),它无法推断出模板类型。

我发现的一种方法是将参数类型设置为 std::initializer_list,然后更改行:

data | transform(func3); 到: for (const auto &datum: data) {func3(datum);}

这是因为 return 类型的 func3 是无效的,您只能将 std::views::transform 与 return 某些功能一起使用。

演示 here

只要所有的参数都是同一类型,你就可以像这样构造一个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} );

数组适用于 视图。