57 votes

Est dynamique métaprogrammation mal formé (encore)?

L'un de mes plus bien-aimé/mal inventions j'ai eu la chance de croiser, est le constexpr contre, aka stateful la métaprogrammation. Comme mentionné dans le post, il semble être légale en vertu du C++14, et je me demandais a quelque chose de changé avec le C++17?

Ce qui suit est une mise en œuvre en grande partie basée sur le post

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

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

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

template <int N>
constexpr int read(float, flag<N>)
{
    return N;
}

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

Et nous utiliser comme

static_assert(counter() != counter(), "Your compiler is mad at you"); 

template<int = counter()>
struct S {};

static_assert(!std::is_same_v<S<>, S<>>, "This is ridiculous");

Cela dit en passant, est en contradiction directe avec le Stockage États en C++ Métaprogrammation?

45voto

Barry Points 45207

C'est GTC active problème 2118:

La définition d'un ami de la fonction dans un modèle, puis faisant référence à cette fonction plus tard, fournit un moyen de la capture et de la récupération de la métaprogrammation état. Cette technique est des arcanes et devrait être mis à mal formé.

Les Notes de la Mai 2015 réunion:

GTC est convenu que ces techniques devraient être mal formé, bien que le mécanisme pour leur interdire l'est encore indéterminée.

C'est toujours active problème, rien ne va changer en C++17 ans au moins pour l'instant. Mais quand une telle interdiction mécanisme est déterminé, cela peut être rétroactivement jugé comme un DR

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X