Scott Meyers publicó el contenido y el estado de su próximo libro EC ++ 11. Escribió que un elemento del libro podría ser "Evitar std::enable_if
en firmas de funciones" .
std::enable_if
puede usarse como argumento de función, como tipo de retorno o como plantilla de clase o parámetro de plantilla de función para eliminar condicionalmente funciones o clases de la resolución de sobrecarga.
En esta pregunta se muestran las tres soluciones.
Como parámetro de función:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
Como parámetro de plantilla:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
Como tipo de retorno:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- ¿Qué solución debería preferirse y por qué debería evitar otras?
- ¿En qué casos "Evitar
std::enable_if
en firmas de funciones" se refiere al uso como tipo de retorno (que no es parte de la firma de función normal sino de las especializaciones de plantilla)? - ¿Hay alguna diferencia para las plantillas de funciones miembro y no miembro?
std::enable_if
saturar mis firmas de funciones (especialmente la nullptr
versión fea del argumento de función adicional ) porque siempre parece lo que es, un truco extraño (por algo static if
poderoso) hacer mucho más hermoso y limpio) usando la plantilla black-magic para explotar una función de lenguaje interesante. Es por eso que prefiero el envío de etiquetas siempre que sea posible (bueno, todavía tiene argumentos extraños adicionales, pero no en la interfaz pública y también mucho menos feo y críptico ).
=0
en typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
realidad? No pude encontrar los recursos correctos para entenderlo. Sé la primera parte antes =0
tiene un tipo de miembro int
si U
y int
es el mismo. ¡Muchas gracias!