Heim  >  Artikel  >  Backend-Entwicklung  >  Stateful Metaprogramming in C: Eine legale Technik in C 14, aber wird sich das in C 17 ändern?

Stateful Metaprogramming in C: Eine legale Technik in C 14, aber wird sich das in C 17 ändern?

DDD
DDDOriginal
2024-11-20 18:52:16806Durchsuche

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

Stateful Metaprogramming: Ist es in C noch legal

Eine der umstrittensten Metaprogrammierungstechniken in C, Stateful Metaprogramming, basiert auf diesem Konzept des constexpr-Zählers zum Speichern und Abrufen des Metaprogrammierungsstatus. Derzeit ist diese Technik gemäß C 14 legal. Dies wirft jedoch die Frage auf, ob sich dies mit der Einführung von C 17 ändern wird.

Um das vorliegende Problem zu verstehen, betrachten Sie die folgende Implementierung basierend auf a vorheriger Beitrag:

// 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;
}

Diese Technik wird wie folgt eingesetzt:

// 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");

Allerdings wurde die Rechtmäßigkeit der zustandsbehafteten Metaprogrammierung mit CWG Active Issue 2118 in Frage gestellt. Das Problem schlägt die Verwendung von Friend vor Funktionen in Vorlagen zum Erfassen und Abrufen des Metaprogrammierungsstatus sollten aufgrund ihrer geheimnisvollen Natur als fehlerhaft angesehen werden.

Im Mai 2015 stimmte die CWG zu, dass solche Techniken verboten werden sollten, muss jedoch noch einen geeigneten Mechanismus festlegen. Das Problem bleibt aktiv und bis eine Entscheidung getroffen wird, bleibt die zustandsbehaftete Metaprogrammierung in C legal. Wenn jedoch ein Verbotsmechanismus eingerichtet wird, kann diese Technik rückwirkend als Mängelbericht deklariert werden.

Das obige ist der detaillierte Inhalt vonStateful Metaprogramming in C: Eine legale Technik in C 14, aber wird sich das in C 17 ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn