C++ lambda捕获是否支持可变模板参数
如果我能做到以下几点,那就太好了:C++ lambda捕获是否支持可变模板参数,c++,templates,c++11,lambda,C++,Templates,C++11,Lambda,如果我能做到以下几点,那就太好了: template <class RT, class... PT> class Event { ... void operator()(PT... args) { std::for_each( l.begin(), l.end(), [args...](Handler *p) { (*p)(args...); } ); } ... }; 这一个编译并运
template <class RT, class... PT>
class Event
{
...
void operator()(PT... args)
{
std::for_each(
l.begin(), l.end(), [args...](Handler *p) { (*p)(args...); }
);
}
...
};
这一个编译并运行良好
我想知道为什么lambda语法不起作用
[=](Handler *p) { (*p)(args...); }
它会给出与您相同的错误:
[args](Handler *p) { (*p)(args...); }
抱怨参数包未展开这是gcc中的一个错误。查看或可能。您是否尝试过
[=]
替代?@Kerrek SB这是一个很好的建议,但如果您隔离lambdaauto foo=[=](处理程序*p){(*p)(args…;}代码>,出现两个错误“1)参数包未展开,2)展开模式“args”不包含参数包”。我怀疑这是一个GCC错误,因为它抱怨ARG既不是一个包,也必须是一个包。看起来像是@致命吉他的复制品:这个问题是类似的。但是,这个问题使用显式捕获,而链接的问题是关于隐式捕获。事实上,它已经是一个bug很长时间了,据我所知,它在gcc 4.8和clang中仍然是一个bug。@gnzlbg,它不是clang中的bug。@chico Cool!谢谢我不知道它已经响了!如果仅扩展f(args)代码>到f(arg1),f(arg2)代码>会起作用…@gnzlbg有一种黑客仅仅为了副作用而扩展包模式:std::initializer_list{(void(f(args)),0)代码>。你可以把它放在宏或别的什么东西里。请注意,{}
-初始化保证计算顺序。f(args),0
执行f(args),并计算为零(如果不熟悉,请查找逗号运算符)。我在f附近添加了void
,以防止可能重载的逗号运算符,我们不想在这里使用它(因为不能使用void参数重载它)。所以我只是建立了一个充满零的初始值设定项列表,它恰好执行了所有这些副作用。初始值设定项列表将立即被丢弃。应该没有开销。最坏的情况是编译器在可执行文件中存储一个只读的静态零数组,但我希望编译器意识到它没有被使用。
[args](Handler *p) { (*p)(args...); }