Obecnie wykonuję niektóre metaprogramming szablonu. W moim przypadku mogę obsłużyć dowolny typ "iterowalny", tj. Dowolny typ, dla którego typedef foo const_iterator
istnieje w ten sam sposób. Próbowałem użyć nowego metaprogramowania szablonu C++ 11, ale nie mogłem znaleźć metody wykrywania, czy dany typ nie istnieje.wykrywanie typedef w czasie kompilacji (metaprogramming szablonu)
Ponieważ muszę również włączać i wyłączać inne specjalizacje szablonów w oparciu o inne cechy, używam obecnie szablonu z dwoma parametrami, a drugi jest produkowany za pośrednictwem std::enable_if
. Oto co mam aktualnie robi:
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(){ ... }
};
nie byłem w stanie zrobić coś takiego bez szablonu exists
pomocnika. Na przykład po prostu robi
template<typename T>
struct Foo<T, typename T::const_iterator> {
void do_stuff(){ ... }
};
nie działa, ponieważ w tych przypadkach, w których powinny być stosowane to specjalizacja, nieważne domyślne sprawa została instancja zamiast.
Jednak nie mogłem znaleźć tego exists
w dowolnym miejscu w nowym standardzie C++ 11, który, o ile wiem, po prostu bierze od boost::type_traits
dla tego rodzaju rzeczy. Jednak w przypadku modelu homepage dla boost::type_traits
nie jest wyświetlane żadne odniesienie do niczego, co można zamiast tego wykorzystać.
Czy brakuje tej funkcji, czy też przeoczyłem inny oczywisty sposób osiągnięcia pożądanego zachowania?
Powinieneś zamieścić link do swoich pytań na temat tego, jak ten działa. :) Wygląda na to, że polubiłeś to, widząc, że już kilka razy to sugerujesz. – Xeo
@Xeo, tak to całkiem proste i proste. Ale nie dostaję twojej pierwszej części "Powinieneś zamieścić link do twoich pytań o to, jak ten działa. :) ... masz na myśli, że podczas odpowiadania mam umieścić link do moich poprzednich pytań (zamiast kodu samo) ? Podejrzewam, że nie jest to zalecane na SO. – iammilind
Nono, chodzi mi o to, że zamieścisz link do [twoje pytanie, w którym zapytałeś, jak to działa] (http://stackoverflow.com/questions/6543652/different-template-syntax-for-finding-if-argument -is-a-class-or-not), ponieważ na początku nie jest to tak oczywiste. Woops, i właśnie zauważyłem, że napisałem "pytania", oznaczało tylko jedno pytanie oczywiście. – Xeo