detección de typedef en tiempo de compilación (metaprogramación de plantilla)
Actualmente estoy haciendo una metaprogramación de plantilla. En mi caso, puedo manejar cualquier tipo "iterable", es decir, cualquier tipo para el que untypedef foo const_iterator
existe de la misma manera. Intenté utilizar la nueva metaprogramación de plantilla C ++ 11 para esto, sin embargo, no pude encontrar un método para detectar si falta un cierto tipo.
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 el segundo se produce a través destd::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(){ ... }
};
No pude hacer algo así sin laexists
plantilla de ayuda. Por ejemplo, simplemente haciendo
template<typename T>
struct Foo<T, typename T::const_iterator> {
void do_stuff(){ ... }
};
no funcionó, porque en aquellos casos en los que debería usarse esta especialización, en su lugar se instanciaba el caso predeterminado no válido.
Sin embargo, no pude encontrar esteexists
en cualquier parte del nuevo estándar C ++ 11, que hasta donde yo sé simplemente está tomando deboost::type_traits
para este tipo de cosas. Sin embargo en lapágina principa paraboost::type_traits
no muestra ninguna referencia a nada que pueda usarse en su lugar.
Falta esta funcionalidad o pasé por alto alguna otra forma obvia de lograr el comportamiento deseado?