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

Barbara Streisand
リリース: 2024-10-29 04:42:29
オリジナル
791 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!