Actualmente estoy haciendo metaprogramación de algunas plantillas. En mi caso, puedo manejar cualquier tipo "iterable", es decir, cualquier tipo para el que exista un typedef foo const_iterator
de la misma manera. Intenté utilizar la nueva metaprogramación de plantillas C++ 11 para esto, sin embargo, no pude encontrar un método para detectar si faltaba cierto tipo.detectando typedef en tiempo de compilación (metaprogramación de plantillas)
Porque también necesito activar/desactivar otras especializaciones de plantillas basadas en otras características, actualmente estoy usando una plantilla con dos parámetros, y la segunda se produce a través de std::enable_if
. Esto es lo que estoy haciendo actualmente:
template <typename T, typename Enable = void>
struct Foo{}; // default case is invalid
template <typename T>
struct Foo< T, typename std::enable_if<std::is_fundamental<T>::value>::type>{
void do_stuff(){ ... }
};
template<typename T>
struct exists{
static const bool value = true;
};
template<typename T>
struct Foo<T, typename std::enable_if<exists< typename T::const_iterator >::value >::type> {
void do_stuff(){ ... }
};
yo no era capaz de hacer algo como esto sin la plantilla exists
ayudante. Por ejemplo, simplemente haciendo
template<typename T>
struct Foo<T, typename T::const_iterator> {
void do_stuff(){ ... }
};
no funcionó, ya que en aquellos casos en los que se debe utilizar esta especialización, el caso por defecto se crea una instancia no válido en su lugar.
Sin embargo, no pude encontrar este exists
en ninguna parte del nuevo estándar C++ 11, que hasta donde yo sé, simplemente está tomando de boost::type_traits
para este tipo de cosas. Sin embargo, en el homepage para boost::type_traits
no se muestra ninguna referencia a nada que pueda usarse en su lugar.
¿Falta esta funcionalidad o pasé por alto otra forma obvia de lograr el comportamiento deseado?
Quizás deba publicar un enlace a sus preguntas sobre cómo funciona esto. :) Además, parece que te ha gustado esta, ya te lo he sugerido varias veces. – Xeo
@ Xeo, sí, esto es bastante fácil y directo. Pero no recibí tu primera parte. Quizás deberías publicar un enlace a tus preguntas sobre cómo funciona. :) ... ¿quieres decir que al responder debo poner un enlace a mis preguntas anteriores (en lugar del código)? sí mismo) ? Sospecho que no se recomienda en SO. – iammilind
Nono, lo que quise decir es que publicaste un enlace a [tu pregunta donde preguntaste cómo funciona] (http://stackoverflow.com/questions/6543652/different-template-syntax-for-finding-if-argument -is-a-class-or-not), ya que no es realmente obvio al principio. Woops, y solo noté que escribí 'preguntas', solo quería decir una pregunta, por supuesto. – Xeo