param-pack上的广义lambda捕获?

Jam*_*ree 16 c++ lambda variadic-functions c++14

在C++ 14中,广义lambda捕获让我们做:

template<class T>
auto pack(T t)
{
    return [t=std::move(t)](auto&& f){f(t);};
};
Run Code Online (Sandbox Code Playgroud)

但它没有玩param-pack:

template<class... T>
auto pack(T... t)
{
    return [t=std::move(t)...](auto&& f){f(t...);};
};
Run Code Online (Sandbox Code Playgroud)

是否有任何特殊语法或进一步的标准提案来解决这个问题?

Bri*_*ian 19

我的C++ 14草案说([expr.prim.lambda]/24):

简单捕获后跟省略号是一包扩展(14.5.3).一个初始化捕捉后跟省略号是非法的构造.

所以看起来没有办法进行可变的广义捕获.一个可能的解决方法是只捕获元组中的参数,然后使用这里建议的解决方案之一:"解压缩"一个元组来调用匹配的函数指针

auto pack(T... t)
{
    return [args=make_tuple(std::move(t)...)](auto&& f){
               // find a way to call f with args
           };
};
Run Code Online (Sandbox Code Playgroud)

编辑:

它现在被投票到C++ 20,由这个提议制作.虽然语法有点不同:

template<class... T>
auto pack(T... t)
{
    return [...t=std::move(t)](auto&& f){f(t...);};
};
Run Code Online (Sandbox Code Playgroud)

请注意,...它位于init-capture之前.

  • @Jamboree以下是讨论:https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/ePRzn4K7VcM (3认同)