首頁  >  文章  >  後端開發  >  C 中的狀態元編程:C 14 中的一種合法技術,但這種情況在 C 17 中會改變嗎?

C 中的狀態元編程:C 14 中的一種合法技術,但這種情況在 C 17 中會改變嗎?

DDD
DDD原創
2024-11-20 18:52:16806瀏覽

Stateful Metaprogramming in C  : A Legal Technique in C  14, But Will That Change in C  17?

有狀態元程式設計:在C 語言中是否仍合法

C 中比較有爭議的元程式設計技術之一,有狀態元編程,依賴這個概念constexpr 計數器用於儲存和檢索元編程狀態。目前來看,這種技術在 C 14 下是合法的。但是,這提出了這樣的問題:這種情況是否會隨著 C 17 的引入而改變。

要理解當前的問題,請考慮以下基於以下實現:上一篇文章:

// State storage flag
template <int N>
struct flag {
    friend constexpr int adl_flag(flag<N>&);
    constexpr operator int() { return N; }
};

// State writer
template <int N>
struct write {
    friend constexpr int adl_flag(flag<N>) { return N; }
    static constexpr int value = N;
};

// State reader
template <int N, int = adl_flag(flag<N>{})>
constexpr int read(int, flag<N>, int R = read(0, flag<N + 1>{})) {
    return R;
}

// Stateful counter
template <int N = 0>
constexpr int counter(int R = write<read(0, flag<0>{}) + N>::value) {
    return R;
}

該技術的使用如下:

// Check if counter is stateful with static assertion
static_assert(counter() != counter(), "Your compiler is mad at you");

// Template specialization based on counter state
template<int = counter()>
struct S {};

// Check if template specializations differ with static assertion
static_assert(!std::is_same_v<S<>, S<>, "This is ridiculous");

但是,狀態元編程的合法性在CWG Active Issue 2118 中受到質疑。此問題建議使用友元由於其晦澀難懂的性質,模板中用於捕獲和檢索元編程狀態的函數應被視為格式錯誤。

截至 2015 年 5 月,CWG 同意應禁止此類技術,但尚未確定適當的機制。這個問題仍然活躍,在做出決定之前,有狀態元程式設計在 C 中仍然是合法的。然而,當禁止機制建立後,該技術可能會被追溯為缺陷報告。

以上是C 中的狀態元編程:C 14 中的一種合法技術,但這種情況在 C 17 中會改變嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn