使用 lambda 进行参数包扩展

Any*_*orn 5 c++ variadic-templates

我正在尝试实例化一个函数表(以模拟switch

\n\n
  template<size_t ... N>\n  int f(std::index_sequence<N...>, int k)\n  {\n    static auto f_table = { []() { return N; }... };\n    auto f = f_table.begin() + k;\n    assert((*f)() == k);\n    return (*f)();\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

失败了error: parameter packs not expanded with \xe2\x80\x98...\xe2\x80\x99:

\n\n

我可以使用额外的包装函数,但是为什么 lambda 会失败,有解决方法吗?

\n

Fed*_*dor 1

GCC 不扩展 lambda 表达式中出现的模板参数包是一个错误,最终在 GCC 8 中修复。

注释中也提到了代码的另一个问题是列表中的每个 lambda{ []() { return N; }... }都有自己不同的类型,因此必须+首先使用运算符将​​它们转换为函数指针:

#include <utility>
#include <cassert>

template<std::size_t ... N>
int f(std::index_sequence<N...>, std::size_t k) {
   static auto f_table = { +[]() { return N; }... };
   auto f = f_table.begin() + k;
   assert((*f)() == k);
   return (*f)();
}

int main() {
    f(std::make_index_sequence<3>{}, 2);
}
Run Code Online (Sandbox Code Playgroud)

演示: https: //gcc.godbolt.org/z/jWrfn7d6W