我正在尝试在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没有扩展。这样做的正确方法是什么?
答案 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_;
};