Я очень рад, что нашел for_each_arg(...)
, что значительно облегчает работу с пакетами аргументов.Правильное использование `for_each_arg` - слишком большая пересылка?
template<class F, class...Ts> F for_each_arg(F f, Ts&&...a) { return (void)initializer_list<int>{(ref(f)((Ts&&)a),0)...}, f; }
Я, однако, путать с его правильного использования. Есть много аргументов, которые нужно полностью переадресовать, но выполняю ли я лишнюю пересылку?
Чтение кода становится более трудным с чрезмерной интенсивностью.
struct UselessContainer
{
// Expects a perfectly-forwarded item to emplace
template<typename T> void add(T&&) { }
};
// Creates an `UselessContainer` already filled with `mArgs...`
auto makeUselessContainer(TArgs&&... mArgs)
{
using namespace std;
UselessContainer result;
for_each_arg
(
[&result, &mArgs...] // Am I capturing the `mArgs...` pack correctly here?
(auto&& mX) // Am I passing the arguments to the lambda correctly here?
{
// Is this `forward` necessary?
result.add(forward<decltype(mX)>(mX));
// Could it be replaced with
// `result.add(forward(mX));`
// ?
},
forward<TArgs>(mArgs)... // I assume this `forward` is necessary.
);
return result;
}
Все мои вопросы/сомнения выражены в комментариях в приведенном выше примере кода.
Я не понимаю, почему вам нужно захватить пакет. Остальное выглядит нормально. Вы пересылаете аргументы 'for_each_arg', который пересылает их в лямбду, которая должна переслать их в' add() '. –