带有参数包或初始化列表的 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} );
数组适用于 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}),它无法推断出模板类型。
我发现的一种方法是将参数类型设置为 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} );
数组适用于 c++20 视图。