ホームページ > バックエンド開発 > C++ > C メタプログラミングを使用してコンパイル時の静的配列を動的に作成できますか?

C メタプログラミングを使用してコンパイル時の静的配列を動的に作成できますか?

Patricia Arquette
リリース: 2024-12-04 14:05:11
オリジナル
774 人が閲覧しました

Can C   Metaprogramming Be Used for Dynamically Creating Compile-Time Static Arrays?

C でコンパイル時に静的配列をプログラム的に作成する

問題の概要

伝統的に、C の静的配列はコンパイル時に fix- を使用して定義できます。サイズ配列。ただし、特定のシナリオでは、コンパイル時にプログラムによって値を割り当てることが望ましい場合があります。この記事では、このような静的配列の動的な作成を実現するためのメタプログラミング手法について説明します。

質問 1: プログラムによる値の割り当て

C 0x 機能を使用すると、テンプレートのローカル配列またはメンバー配列を初期化できます。可変個引数テンプレート引数リスト。この回避策には、テンプレートのインスタンス化の深さが最大であるため制限があります。

質問 2: 選択的な値の割り当て

コンパイル時に値を選択的に割り当てるには、可変個引数テンプレートとメタ関数の組み合わせを使用できます。 MetaFunc テンプレートは、インデックスに基づいて一連の値を生成するパラメーター パックとして機能します。 Generate_array テンプレートは、生成された値を使用して、必要なサイズの配列を作成できます。

実装例

template<size_t index> struct MetaFunc { enum { value = index + 1 }; };

template<size_t N, template<size_t> class F> 
struct generate_array {
    typedef typename generate_array_impl<N-1, F>::result result;
};

template<size_t N, template<size_t> class F, unsigned... args> 
struct generate_array_impl {
    typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};

template<template<size_t> class F, unsigned... args> 
struct generate_array_impl<0, F, args...> {
    typedef ArrayHolder<F<0>::value, args...> result;
};

template<unsigned... args> struct ArrayHolder {
    static const unsigned data[sizeof...(args)];
};

template<unsigned... args> 
const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
ログイン後にコピー

使用例

void test() {
    const size_t count = 5;
    typedef generate_array<count, MetaFunc>::result A;

    for (size_t i = 0; i < count; ++i) 
        std::cout << A::data[i] << "\n";
}
ログイン後にコピー

この例では、静的サイズ 5 の配列。コンパイル時に値 {1, 2, 3, 4, 5} が割り当てられます。 MetaFunc メタ関数。

以上がC メタプログラミングを使用してコンパイル時の静的配列を動的に作成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート