ホームページ > バックエンド開発 > C++ > C 0x メタプログラミング手法を使用して、コンパイル時に静的配列にプログラムで値を割り当てることはできますか?

C 0x メタプログラミング手法を使用して、コンパイル時に静的配列にプログラムで値を割り当てることはできますか?

Linda Hamilton
リリース: 2024-12-05 06:09:10
オリジナル
691 人が閲覧しました

Can C  0x Metaprogramming Techniques be Used to Programmatically Assign Values to Static Arrays at Compile Time?

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

C でコンパイル時に静的配列を定義できるとすると、次のことが可能ですか?メタプログラミングを使用してプログラム的に値を割り当てるテクニック?

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

はい、C 0x 機能を使用すると、コンパイル時に配列要素を「プログラム的に」初期化することが可能です。次の例を考えてみましょう。

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

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

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

配列に一部の例外を除いて繰り返し値が含まれていると仮定すると、選択的に割り当てることが可能です。プログラムによる値:

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<size_t N, template<size_t> class F>
struct generate_array {
    typedef typename generate_array_impl<N-1, F>::result result;
};
ログイン後にコピー

ゼロが繰り返される配列の使用法要素 2 と 3 を除く:

template<size_t index>
struct MetaFunc {
    enum { value = index == 2 || index == 3 ? index + 1 : 0 };
};

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

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

これらのソリューションはテンプレートのインスタンス化の最大深さによって制限されますが、プログラムによる配列の作成と初期化に対する C 0x の可能性を示しています。

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

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