Heim > Artikel > Backend-Entwicklung > Stateful Metaprogramming in C: Eine legale Technik in C 14, aber wird sich das in C 17 ändern?
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!