Я очень рад, что обнаружил for_each_arg(...)
, который значительно упрощает работу с пакетами аргументов.
template<class F, class...Ts> F for_each_arg(F f, Ts&&...a) { return (void)std::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()
. - person T.C.   schedule 01.02.2015