变异模板lambda扩展

时间:2012-03-25 00:16:57

标签: c++ c++11 variadic-templates lambda

我正在尝试在Herb Sutter's Example之后实现委托类。本文中有一些部分复制了几个模板;列表中参数数量的一个模板(例7,第41-59行)1。我试图用可变参数模板替换它。

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...);
        });
    }

我发现了这个answer,但我认为我的问题是vs没有扩展。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

我不确定为什么vs不会扩展,但也许简单的解决方法是将值作为默认值传递参数,并命名需要通过引用传递的已知对象。这样就不需要捕获列表中的扩展。就个人而言,如果这是gcc中的错误,我不会感到惊讶(你的例子不完整 - 否则我会用最新的gcc和clang的SVN版本来试试。)

答案 1 :(得分:1)

这似乎是一个旧的gcc bug仍然存在。可能想给维护者一个友好的轻推。

解决方法可能是:

#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_;
};