簡體   English   中英

使用 lambda 擴展參數包

[英]Parameter pack expansion with lambda

我正在嘗試實例化一個函數表(模擬switch<\/code> )

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

GCC 沒有擴展出現在 lambda-expression 中的模板參數包是一個錯誤,該錯誤最終在 GCC 8 中得到修復。

注釋中還提到的代碼的另一個問題是列表中的每個 lambda { []() { return N; }... } { []() { 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);
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM