ホームページ >バックエンド開発 >C++ >デフォルトで構築できない型を使用して std::array をエレガントに初期化する方法

デフォルトで構築できない型を使用して std::array をエレガントに初期化する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-29 04:42:29856ブラウズ

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

デフォルト以外で構成可能な型を使用した std::array のエレガントな初期化

デフォルト以外の型を使用した std::array の初期化構築可能な要素タイプは面倒な作業になる可能性があります。手動で値を n 回繰り返すことは、n が大きい場合には非効率的でエラーが発生しやすくなります。

この問題に対処するには、シーケンス タイプとジェネレーターを使用する、より洗練されたアプローチが必要です。重要なアイデアは、0 から n-1 までのインデックスのシーケンスを作成し、関数を使用して各インデックスに値を繰り返し適用することです。

実装は次のとおりです。

<code class="cpp">template<typename T, int...N>
auto repeat(T value, seq<N...>) -> std::array<T, sizeof...(N)>
{
  // Unpack N, repeating `value` sizeof...(N) times
  // Note that (X, value) evaluates to value
  return {(N, value)...};
}</code>

このアプローチを使用して std::array を初期化します:

<code class="cpp">template<typename T, int N>
void f(T value)
{
  // genseq_t<N> is seq<0,1,...N-1>
  std::array<T, N> items = repeat(value, genseq_t<N>{});
}</code>

さらに、次の定義が使用されます:

<code class="cpp">template<int ... N>
struct seq
{
  using type = seq<N...>;

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

  template<int I>
  struct push_back : seq<N..., I> {};
};

template<int N>
struct genseq : genseq<N-1>::type::template push_back<N-1> {};

template<>
struct genseq<0> : seq<> {};

template<int N>
using genseq_t = typename genseq<N>::type;</code>

このソリューションは、std::array を初期化する効率的かつ洗練された方法を提供します。 n の値に関係なく、デフォルトで構築できない型を使用します。

以上がデフォルトで構築できない型を使用して std::array をエレガントに初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。