¿estático afirmar que el nombre de tipo de plantilla T NO está completo?
¿Hay alguna forma de static_assert de que un tipo T esNo completa en ese punto en un encabezado? La idea es tener un error de compilación si alguien agrega #incluye más adelante en lugares donde no deberían estar.
relacionado:¿Cómo escribir la plantilla `is_complete`?
Usando la respuesta de ese enlace,
namespace
{
template<class T, int discriminator>
struct is_complete {
static T & getT();
static char (& pass(T))[2];
static char pass(...);
static const bool value = sizeof(pass(getT()))==2;
};
}
#define IS_COMPLETE(X) is_complete<X,__COUNTER__>::value
class GType;
static_assert(!IS_COMPLETE(GType),"no cheating!");
desafortunadamente esto da un error de "uso no válido de tipo incompleto", por supuesto. ¿Hay alguna manera de afirmar sobre la negación?