」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用非預設可構造型別優雅地初始化`std::array`?

如何使用非預設可構造型別優雅地初始化`std::array`?

發佈於2024-11-24
瀏覽:286

How to Elegantly Initialize a `std::array` with Non-Default-Constructible Types?

使用非預設建構型別優雅地初始化std::array

使用非預設建構型別初始化std::array可建構元素型別可能是一項繁瑣的任務。對於較大的 n,手動重複該值 n 次效率低且容易出錯。

為了解決這個問題,一種更優雅的方法涉及利用序列類型和生成器。關鍵想法是建立從 0 到 n-1 的索引序列,然後使用函數重複將值應用於每個索引。

這是一個實作:

template
auto repeat(T value, seq) -> std::array
{
  // Unpack N, repeating `value` sizeof...(N) times
  // Note that (X, value) evaluates to value
  return {(N, value)...};
}

使用此方法初始化 std::array:

template
void f(T value)
{
  // genseq_t is seq
  std::array items = repeat(value, genseq_t{});
}

此外,還使用以下定義:

template
struct seq
{
  using type = seq;

  static const std::size_t size = sizeof ... (N);

  template
  struct push_back : seq {};
};

template
struct genseq : genseq::type::template push_back {};

template
struct genseq : seq {};

template
using genseq_t = typename genseq::type;

此解決方案提供了一種高效且優雅的方式來使用非預設建構型別初始化 std::array,無論 n 的值為何。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3