Variadic Шаблон лямбда-расширения - PullRequest
2 голосов
/ 25 марта 2012

Я пытаюсь реализовать класс делегата, следуя Пример Херба Саттера .В этой статье есть разделы, которые дублируют несколько шаблонов;один шаблон для количества аргументов в списке (пример 7, строки 41–59) 1 .Я пытаюсь заменить это с помощью шаблона variadic.

void operator()() const {
    for_each(begin(l_), end(l_), []( function<F> i) {
            i(); 
    });
}

template<typename... Ts>
    void operator()(Ts... vs) const {
        for_each(begin(l_), end(l_), [&, vs...]( function<F> i) //g++-4.6.1: expected ',' before '...' token; expected identifier before '...' token
        { 
                i(vs...);
        });
    }

Я нашел этот ответ , но я думаю, что моя проблема в том, что vs не расширяется.Как правильно это сделать?

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Я не уверен, почему vs не расширяется, но, возможно, простой способ обойти это - передать аргументы по значению по умолчанию и назвать известные объекты, нуждающиеся в передаче по ссылке. Таким образом, расширение в списке захвата не требуется. Лично я не удивлюсь, если бы это была ошибка в gcc (ваш пример неполон - иначе я бы попробовал это с последними версиями SVN gcc и clang).

1 голос
/ 25 марта 2012

Это старая ошибка gcc , которая все еще сохраняется. Возможно, вы хотите, чтобы сопровождающие дружелюбно подтолкнули.

Обходной путь может быть:

#include <vector>
#include <algorithm>
#include <functional>
#include <tuple>

using namespace std;

template<typename F>
struct Foo {
  template<typename... Ts>
  void operator()(Ts... vs) const {
    auto t = tie(vs...);

    for_each(begin(l_), end(l_), 
             [&t]( function<F> i) 
             { 
               // figure out the function arity and unpack the tuple
               // onto it. This is could be more difficult than one
               // thinks.

               // i(vs...);
             }
      );
  }
  vector< function< F > > l_;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...