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?

Respuestas a la pregunta(4)

Su respuesta a la pregunta