He estado usando (y visto usado) static_assert
para marcar los valores no deseados de los valores de los parámetros de la plantilla. Sin embargo, para todos los casos que encontré parece mejor y más elegante desactivar esos valores no deseados a través de SFINAE. Por ejemploCuándo usar `static_assert` en lugar de SFINAE?
template<typename T,
class = std::enable_if<std::is_floating_point<T>::value>::type>
struct Foo { ... };
en lugar de
template<typename T>
struct Foo {
static_assert(std::is_floating_point<T>::value,
"Foo<T>: T must be floating point :-(");
...
};
Así que mi pregunta: ¿cuándo se debe utilizar en lugar de static_assert
SFINAE y por qué?
EDITAR
creo que lo que he aprendido hasta ahora es la siguiente
SFINAE es una herramienta versátil y poderosa pero potencialmente muy complicado que puede ser usado para muchas tareas, incluyendo resolución de sobrecarga de función (que algunos parecen considerar como su único propósito).
SFINAE se puede utilizar de una manera relativamente simple donde cada vez static_assert
puede, excepto que aparece en la declaración (de una clase o función) en lugar de su definición (o es posible insertar a static_assert
en, digamos, una declaración de reenvío de clase?). Eso hace que el código sea más literal y, por lo tanto, más claro. Sin embargo, debido a que SFINAE es complicado, tiende a ser más difícil acertar que un simple static_assert
.
Por otro lado, static_assert
tiene la ventaja de un mensaje de error del compilador más claro, que algunos parecen considerar como el objetivo principal de cualquiera.
¿Puede explicar por qué cree que es mejor con SFINAE? –
Quizás nuestras respuestas estén orientadas por el vocabulario. En su pregunta, creo que debería reemplazar SFINAE por 'std :: enable_if'. Parece extraño querer generar un error con un mecanismo que enfatice el hecho de que no es un error. SFINAE = La falla de sustitución no es un error – log0