Ver Mensaje Individual
  #8 (permalink)  
Antiguo 01/12/2014, 10:19
Pantaláimon
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 9 meses
Puntos: 32
Respuesta: Crear plantilla dynamic. Lo que viene a ser tuple para struct, hacerlo par

He leído el enlace y no acabo de entender que es lo que debo aplicar. La persona está preguntando por cual de las 3 maneras es preferible usar std::enable_if.

La respuesta más puntuada habla de usar enable_if como un parámetro de un template. Entonces miro el código correspondiente:
Código C++:
Ver original
  1. template<typename T>
  2. struct Check2
  3. {
  4.    template<typename U = T, typename std::enable_if<
  5.             std::is_same<U, int>::value, int>::type = 0>
  6.    U read() { return 42; }
  7.  
  8.    template<typename U = T, typename std::enable_if<
  9.             std::is_same<U, double>::value, int>::type = 0>
  10.    U read() { return 3.14; }  
  11. };

Y observo algo que no acabo de entender como se comporta. ¿Se supone que si el primer "parámetro de enable_if es false, la plantilla donde está enable_if no se compilará? Hago la siguiente prueba basado en eso:
Código C++:
Ver original
  1. template<typename T>
  2. struct A
  3. {
  4.    template<typename U, typename std::enable_if<
  5.             std::is_same<U, int>::value, int>::type = 0>
  6.    U foo(const U& u) { return 42; }
  7.  
  8.    template<typename U, typename std::enable_if<
  9.             std::is_same<U, double>::value, int>::type = 0>
  10.    U foo(const U& u) { return 3.14; }  
  11. };
  12.  
  13. #include <type_traits>
  14. #include <string>
  15.  
  16. int main() {
  17.     A<int> x;
  18.     std::cout << x.foo(1.8) << std::endl; // 3.14
  19.     std::cout << x.foo(2) << std::endl; // 42
  20.     return 0;
  21. }

Hago una prueba más avanzada comparando el tipo T con el tipo U y si son iguales se implementará una función, si no son iguales se implementará otra:

Código C++:
Ver original
  1. template<typename T>
  2. struct A
  3. {
  4.    template<typename U, typename std::enable_if<
  5.             std::is_same<U, T>::value, int>::type = 0>
  6.    int foo(const U& u) { return 42; }
  7.  
  8.    template<typename U, typename std::enable_if<
  9.             !std::is_same<U, T>::value, int>::type = 0>
  10.    double foo(const U& u) { return 3.14; }  
  11. };
  12.  
  13. int main() {
  14.     A<double> x;
  15.     std::cout << x.foo(1.8) << std::endl; // 42
  16.     std::cout << x.foo(2) << std::endl; // 3.14
  17.     A<int> y;
  18.     std::cout << y.foo(1.8) << std::endl; // 3.14
  19.     std::cout << y.foo(2) << std::endl; // 42
  20.     return 0;
  21. }

Uau! funciona! Con esto ya puedo seguir avanzando.
__________________
github.com/xgbuils | npm/xgbuils