Maison > développement back-end > C++ > le corps du texte

Métaprogrammation avec état en C : une technique juridique en C 14, mais cela changera-t-il en C 17 ?

DDD
Libérer: 2024-11-20 18:52:16
original
801 Les gens l'ont consulté

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

Métaprogrammation avec état : est-ce toujours légal en C

L'une des techniques de métaprogrammation les plus controversées en C, la métaprogrammation avec état, repose sur le concept du compteur constexpr pour stocker et récupérer l'état de métaprogrammation. Dans l’état actuel des choses, cette technique est légale sous C 14. Cependant, cela soulève la question de savoir si cela va changer avec l’introduction de C 17.

Pour comprendre le problème en question, considérons l’implémentation suivante basée sur un message précédent :

// 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;
}
Copier après la connexion

Cette technique est utilisée comme suit :

// 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");
Copier après la connexion

Cependant, la légalité de la métaprogrammation avec état a été remise en question avec le CWG Active Issue 2118. Le numéro propose que l'utilisation d'un ami les fonctions dans les modèles pour capturer et récupérer l'état de la métaprogrammation devraient être considérées comme mal formées en raison de leur nature obscure.

En mai 2015, le CWG a convenu que de telles techniques devraient être interdites, mais n'a pas encore déterminé un mécanisme approprié. Le problème reste actif et jusqu'à ce qu'une décision soit prise, la métaprogrammation avec état restera légale en C . Toutefois, lorsqu'un mécanisme d'interdiction est établi, cette technique peut être déclarée rétroactivement comme un rapport de défaut.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal