erkennen typedef zur compile-Zeit (Schablone metaprogramming)

Ich bin derzeit dabei einige template-metaprogramming. In meinem Fall kann ich mit jedem "iteratable" geben, d.h. jede Art, für die eine typedef foo const_iterator existiert in der gleichen Weise. Ich habe versucht, verwenden Sie die neue C++11 template metaprogramming für diese, dennoch konnte ich nicht finden, eine Methode zu erkennen, ob eine bestimmte Art fehlt.

Weil ich brauche auch ein - /ausschalten andere template-Spezialisierungen auf der Grundlage von anderen Eigenschaften, ich bin derzeit mit einer Vorlage mit zwei Parametern, und die zweite bekommt man produziert über std::enable_if. Hier ist, was ich bin derzeit dabei:

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(){ ... }
};

Ich war nicht in der Lage, so etwas zu tun, ohne die exists Helfer-Vorlage. Zum Beispiel einfach tun

template<typename T>
struct Foo<T, typename T::const_iterator> {
    void do_stuff(){ ... }
};

nicht funktioniert, weil in jenen Fällen, wo diese Spezialisierung benutzt werden sollte, wird die ungültige Standard-Fall instanziiert wurde, statt.

Aber ich konnte nicht finden, diese exists irgendwo in der neuen C++11 standard ist, soweit ich weiß, einfach ist die Einnahme von boost::type_traits für diese Art von Sachen. Aber auf der homepage für boost::type_traits zeigt keinerlei Referenz auf etwas, dass könnte stattdessen verwendet werden.

Ist diese Funktionalität fehlt, oder habe ich das übersehen einige andere offensichtliche Weg, um zu erreichen das gewünschte Verhalten?

InformationsquelleAutor LiKao | 2011-10-20
Schreibe einen Kommentar