如何以"unzipping"的方式扩展参数包模式?
How to expand parameter pack pattern in an "unzipping" manner?
假设我有一个可变函数,foo
:
template <typename... Args>
void foo(Args... args)
{
// some work
}
我想要一个魔术函数,bar
,以下列方式将其参数转发给 foo
:
说如果我打电话
bar(x, y, z);
效果与
相同
foo(x.begin(), x.end(), y.begin(), y.end(), z.begin(), z.end());
如何实现这样的bar()
?
template <typename... Args>
void bar(Args... args)
{
// what should I put here?
// foo( (args.begin(), args.end()) ... ); // doesn't work
}
如果可以使用C++17,申请std::apply
:
template<class ... Conts>
void bar(Conts&& ... c) {
auto t = std::make_tuple( std::make_tuple(c.begin(),c.end())... );
// tuple< tuple<C1.begin,C1.end>, tuple<C2.begin,C2.end>, ... > [1]
std::apply( [](auto&&... tuples){
auto oneTuple = std::tuple_cat(std::forward<decltype(tuples)>(tuples)...);
// tuple< C1.begin(), C1.end(), C2.begin(), C2.end(), ...> [2]
std::apply([](auto&&... its){
foo(std::forward<decltype(its)>(its)...); /// all iterators begin/end [3]
}, oneTuple);
}, t);
}
- 为所有条目创建
tuple<begin,end>
的元组
- 使用
apply
获取在第一步中创建的所有元组,并通过连接从中生成一个元组 - 使用 tuple_cat
- 再次使用
apply
从第二步创建的元组中提取所有迭代器,将它们全部传递给foo
假设我有一个可变函数,foo
:
template <typename... Args>
void foo(Args... args)
{
// some work
}
我想要一个魔术函数,bar
,以下列方式将其参数转发给 foo
:
说如果我打电话
bar(x, y, z);
效果与
相同foo(x.begin(), x.end(), y.begin(), y.end(), z.begin(), z.end());
如何实现这样的bar()
?
template <typename... Args>
void bar(Args... args)
{
// what should I put here?
// foo( (args.begin(), args.end()) ... ); // doesn't work
}
如果可以使用C++17,申请std::apply
:
template<class ... Conts>
void bar(Conts&& ... c) {
auto t = std::make_tuple( std::make_tuple(c.begin(),c.end())... );
// tuple< tuple<C1.begin,C1.end>, tuple<C2.begin,C2.end>, ... > [1]
std::apply( [](auto&&... tuples){
auto oneTuple = std::tuple_cat(std::forward<decltype(tuples)>(tuples)...);
// tuple< C1.begin(), C1.end(), C2.begin(), C2.end(), ...> [2]
std::apply([](auto&&... its){
foo(std::forward<decltype(its)>(its)...); /// all iterators begin/end [3]
}, oneTuple);
}, t);
}
- 为所有条目创建
tuple<begin,end>
的元组 - 使用
apply
获取在第一步中创建的所有元组,并通过连接从中生成一个元组 - 使用tuple_cat
- 再次使用
apply
从第二步创建的元组中提取所有迭代器,将它们全部传递给foo