c++ - metaprogramacion - ¿La metaprogramación con estado está mal formada(todavía)?
metaprogramacion c++ (1)
Este es el problema activo 2118 de CWG :
Definir una función amiga en una plantilla, luego hacer referencia a esa función más adelante proporciona un medio de capturar y recuperar el estado de metaprogramación. Esta técnica es arcana y debe hacerse mal formada.
Notas de la reunión de mayo de 2015:
El CWG acordó que tales técnicas deberían estar mal formadas, aunque el mecanismo para prohibirlas aún no se ha determinado.
Todavía es un problema activo, nada cambiará en C ++ 17 al menos por ahora. Sin embargo, cuando se determina un mecanismo de prohibición de este tipo, esto puede ser gobernado retroactivamente como un DR.
Uno de mis inventos más queridos / malvados que he tenido la fortuna de encontrar es el contador constexpr , también conocido como metaprogramación con estado. Como se menciona en la publicación, parece ser legal en C ++ 14, y me pregunto si algo ha cambiado con C ++ 17.
La siguiente es una implementación basada en gran medida en la publicación
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;
}
Y lo usamos como
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");
Esto, por cierto, ¿es una contradicción directa con el almacenamiento de estados en la metaprogramación de C ++?