2013-03-07 4 views
2

Для каждого аргумента мне нужно применить два вложенной функцию:VARIADIC аргументы шаблона распаковка

obj.apply(someFilter(arg)); // arg is one argument, but here 
          // should be an unpacking of args 

Я не знаю, как писать распаковку для такого случая.

Я видел это:

pass{([&]{ std::cout << args << std::endl; }(), 1)...}; 

on wiki, но опять-таки не знаю, как применить это для моего случая.

+0

Когда вы говорите о распаковке, вы имеете в виду, что ваш единственный аргумент arg должен быть распакован в несколько аргументов? – souldzin

ответ

3

Это на самом деле довольно просто: Вы можете поместить произвольное выражение внутри распаковки с VARIADIC шаблонов аргументов пакета:

obj.apply(someFilter(arg))... 

Это даст вам результат obj.apply как кома отделено список. Затем вы можете передать его фиктивной функции:

template<typename... Args> swallow (Args&&...) {} 
swallow(obj.apply(someFilter(arg))...); 

Чтобы проглотить запятыми список.

Конечно, это предполагает, что obj.apply возвращает какой-то объект. Если вы не можете использовать

swallow((obj.apply(someFilter(arg)), 0)...); 

сделать фактические (не являющиеся void) аргументов

Если вы не знаете, что obj.apply` возвращается (результат может быть перегружен оператор запятой), вы можете отключить использование операторов пользовательских разделителей с помощью

swallow((obj.apply(someFilter(arg)), void(), 0)...); 

Если вы на самом деле нужно, чтобы оценить детали в порядке (что не кажется, весьма вероятно, от вопроса), вы можете злоупотребить синтаксис инициализации массива, вместо того, чтобы использовать вызов функции:

using Alias=char[]; 
Alias{ (apply(someFilter(args)), void(), '\0')... }; 
+0

Ошибка - выражение содержит пакет невыполненных пакетов 'args' Error - expected ';' после выражения – user14416

+0

@ user14416: Он все еще дает эту ошибку с моим редактированием? Я случайно отправил ответ, прежде чем он был закончен. – Grizzly

+0

Нет, спасибо, теперь все в порядке! – user14416

0

Я предполагаю, что код имеет несколько arg s как пакет параметров? Попробуйте:

obj.apply(someFilter(arg)...); 

в качестве параметра распаковки относится к выражению, поэтому каждый элемент параметры пакет прибудет Расширенный в someFilter(arg).

0

Вот надежный способ выполнения произвольного набора действий в пакете параметров. Отсюда следует принцип наименьшего удивления, и делает операции в следующем порядке:

template<typename Lambda, typename Lambdas> 
void do_in_order(Lambda&& lambda, Lambdas&& lambdas) 
{ 
    std::forward<Lambda>(lambda)(); 
    do_in_order(std::forward<Lambdas>(lambdas)...); 
} 

void do_in_order() {} 

template<typename Args> 
void test(Args&& args) { 
    do_in_order([&](){obj.apply(someFilter(std::forward<Args>(args)));}...); 
} 

В принципе, вы посылаете кучу лямбды на do_in_order, который оценивает их спереди назад.

Смежные вопросы