【问题标题】:Parameter pack expansion with lambda使用 lambda 扩展参数包
【发布时间】:2019-09-06 23:13:56
【问题描述】:

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

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

error: parameter packs not expanded with ‘...’: 失败

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

【问题讨论】:

  • g++ 5.4 (Ubuntu 5.4.0-6ubuntu1~16.04.11)
  • 这个 works 在新的 GCC 中稍作修改。
  • 那是古老的。
  • @HolyBlackCat: ...因为 lambdas 有不同的类型,如果这对每个人来说都不是很明显的话。

标签: c++ variadic-templates


【解决方案1】:

GCC doesn't expand template parameter pack that appears in a lambda-expression 是一个错误,最终在 GCC 8 中修复。

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

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

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

【讨论】:

    猜你喜欢
    • 2021-06-11
    • 2017-09-09
    • 2023-03-10
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多