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_ifen 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_ifen 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_ifsaturar mis firmas de funciones (especialmente la nullptrversión fea del argumento de función adicional ) porque siempre parece lo que es, un truco extraño (por algo static ifpoderoso) 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 ).
=0en typename std::enable_if<std::is_same<U, int>::value, int>::type = 0realidad? No pude encontrar los recursos correctos para entenderlo. Sé la primera parte antes =0tiene un tipo de miembro intsi Uy intes el mismo. ¡Muchas gracias!