C で非定数変数をテンプレート引数として使用できないのはなぜですか?

Patricia Arquette
リリース: 2024-10-29 18:42:00
オリジナル
276 人が閲覧しました

Why Can't Non-Constant Variables Be Used as Template Arguments in C  ?

定数以外の変数をテンプレート引数として渡すことができないのはなぜですか?

C では、テンプレート引数は定数式である必要があります。これは、それらの値がコンパイル時に既知である必要があることを意味します。コンパイラは、このコンテキストでは非定数変数を評価できません。

コードを検討してください:

<code class="cpp">template <int a>
void modify(){}</code>
ログイン後にコピー

非定数変数をテンプレート引数として渡すには、次のように記述します:

<code class="cpp">for(int i = 0; i < 10; i++) {
    modify<i>();
}</code>
ログイン後にコピー

ただし、コンパイラはコンパイル時に i の値を決定できないため、エラーが発生します。ループ本体は複数回実行され、i の値が変更される場合があります。

API を変更せずに目的を達成する

非定数変数を直接渡す代わりに、テンプレートの特殊化を使用して実装できます。反復呼び出し:

<code class="cpp">#include <iostream>

template<>
void modify<0>() { std::cout << "modify<0>" << std::endl; }

template<>
void modify<1>() { std::cout << "modify<1>" << std::endl; }

// ...

template<int i>
void modify() {
    std::cout << "modify<" << i << ">" << std::endl;
    modify<i+1>();
}

int main() {
    modify<0>();
}</code>
ログイン後にコピー

動的値を使用した Modify の呼び出し

コンパイル時に不明な値を使用して Modify を呼び出すには、テンプレート メタプログラミングと呼ばれる手法を使用できます。簡略化した例を次に示します。

<code class="cpp">#include <tuple>

template <std::tuple<int...>>
struct TupleSize;

template <int... Args>
struct TupleSize<std::tuple<Args...>> {
    static const int value = sizeof...(Args);
};

template <int N>
void callModify(int i) {
    if constexpr (i < N) {
        modify<i>();
        callModify<N>(i+1);
    }
}

int main() {
    int n = 10;
    callModify<TupleSize<std::make_tuple(1,2,3,4,5,6,7,8,9,10)>::value>(0);
}</code>
ログイン後にコピー

この例では、callModify は、i に必要な値の範囲を含むタプルのサイズであるパラメーター N を受け取ります。この関数は再帰的メタプログラムを使用して、指定されたサイズ N まで変更する呼び出しを生成します。

以上がC で非定数変数をテンプレート引数として使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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