using namespace std;
template
constexpr auto
for_each(tuple as, F f) {
return apply(
[](auto... xs){
(f(xs), ... )
}
as
);
}
< /code>
Я могу его гнездиться < /p>
void g(A a, B b);
template
constexpr auto
run_all(
tuple as,
tuple bs)
{
return for_each(
as,
[bs](auto x){
for_each(
bs,
[x](auto y) {
g(x, y);
}
);
}
);
}
< /code>
Но если я вставлю его в его вложенной версии, я получаю что-то вроде < /p>
void g(A a, B b);
template
constexpr auto
run_all(
tuple as,
tuple bs)
{
return apply(
[bs](auto... xs){
(
apply(
[xs](auto... ys){
(g(xs, ys), ...);
},
bs
)
, ...);
},
as
);
}
И мне не хватает, как знает внутренний эллипсис », чтобы расширить только ys , а не xs . Защищен ли XS от расширения запечатленным или что -то в этом роде? Или, может быть, мне нужно признать, что вы не всегда можете встроить в присутствии пакетов? Где -то я смущен.>
Я разъяснял некоторые из моих пониманий мета-программирования C ++. Поэтому, глядя на такую функцию, как (мой код) < /p> [code]using namespace std;
template constexpr auto for_each(tuple as, F f) { return apply( [](auto... xs){ (f(xs), ... ) } as ); }
< /code> Я могу его гнездиться < /p> void g(A a, B b);
template constexpr auto run_all( tuple as, tuple bs) { return for_each( as, [bs](auto x){ for_each( bs, [x](auto y) { g(x, y); } ); } ); } < /code> Но если я вставлю его в его вложенной версии, я получаю что-то вроде < /p> void g(A a, B b);
template constexpr auto run_all( tuple as, tuple bs) { return apply( [bs](auto... xs){ ( apply( [xs](auto... ys){ (g(xs, ys), ...); }, bs ) , ...); }, as ); } [/code] И мне не хватает, как знает внутренний эллипсис », чтобы расширить только ys , а не xs . Защищен ли XS от расширения запечатленным или что -то в этом роде? Или, может быть, мне нужно признать, что вы не всегда можете встроить в присутствии пакетов? Где -то я смущен.>