テンプレートのメタプログラミングを使用して、デフォルト以外の構築可能な std::array をエレガントに初期化する方法

Linda Hamilton
リリース: 2024-10-28 04:59:01
オリジナル
762 人が閲覧しました

How to Initialize Non-Default Constructible std::array Elegantly with Template Metaprogramming?

デフォルト以外の構成可能な std::array をエレガントに初期化する

C でデフォルト以外の構成可能な型を扱う場合、特に std::array の初期化が困難になることがあります。配列のサイズがテンプレート パラメーターによって決定される場合。

これに対処するために、シーケンス タイプとジェネレーターの概念を活用する洗練されたアプローチを導入します。

Sequence-Type seq

テンプレート メタ関数を使用して、seq と呼ばれるシーケンス タイプを定義します。これは、連続する整数のシーケンスを表します。

<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> {};
};</code>
ログイン後にコピー

ジェネレーター genseq

このシーケンスを使用して、次を生成するジェネレーター genseq を構築します。長さが増加するシーケンス:

<code class="cpp">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>
ログイン後にコピー

repeat() Function

シーケンスを配置したら、repeat() 関数を定義して、同じ値で初期化された配列を作成します:

<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 を初期化するには、目的の値と genseq_t:

<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>
ログイン後にコピー
このソリューションは、std::array のエレガントかつ効率的な初期化を保証し、n が大きなテンプレート パラメーターである場合の面倒な手動の繰り返しの必要性を効果的に排除します。

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

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