首頁 > 後端開發 > C++ > 主體

為什麼非常量變數不能用作 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>
登入後複製

使用動態值呼叫修改

要使用編譯時未知的值呼叫修改,我們可以使用稱為模板元程式設計的技術。這是一個簡化的範例:

<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 採用參數 N,該參數是包含 i 所需值範圍的元組的大小。此函數使用遞歸元程序產生呼叫以修改至指定大小 N。

以上是為什麼非常量變數不能用作 C 中的模板參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!