ホームページ >バックエンド開発 >C++ >C で非定数変数をテンプレート引数として使用できないのはなぜですか?

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

Susan Sarandon
Susan Sarandonオリジナル
2024-10-29 08:53:30675ブラウズ

 Why can't I use a non-constant variable as a template argument in C  ?

非定数テンプレート引数の難問

次のコード スニペットの i など、非定数変数をテンプレート引数として渡そうとすると、コンパイラーは次のエラーを出します。エラー:

<code class="cpp">template <int a>
void modify() {}

for (int i = 0; i < 10; i++) {
    modify<i>(); // error: 'i' cannot appear in constant-expression
}</code>

エラーの理由:

テンプレートはコンパイル中に展開されるため、コンパイル時に引数を評価する必要があります。 i はループ内で変更されるため、コンパイラはコンパイル時にその値を決定できず、エラーが発生します。

代替実装:

なしで目的の反復を実現するにはAPI インターフェイスを変更する場合は、次の実装を検討してください:

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

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

template<int x, int to>
struct static_for
{
    void operator()() 
    {  modify<x>();  static_for<x+1,to>()(); }
};

template<int to>
struct static_for<to,to>
{
    void operator()() 
    {}
};


int main()
{
    static_for<0,10>()();
}</code>

このバージョンでは、再帰を利用して反復をエミュレートします。値ごとに特殊なテンプレート関数 (たとえば、modify<0>、modify<1> など) をインスタンス化することにより、コードは i=0 から i=9 までのループ動作をシミュレートします。

Non -定数テンプレート引数の解決:

変数引数 VAR (関数計算によって決定される) を使用して modify を呼び出すには、次のように可変引数パラメーターを持つテンプレート関数の使用を検討してください。

<code class="cpp">template <typename T>
void modify(const T& x)
{ std::cout << "modify(" << x << ")" << std::endl; }

int main()
{
    auto VAR = ...; // computed from some functional process
    modify(VAR);
}</code>

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。