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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen einfach nur, ob eine bestimmte Art enthält
const_iterator
dann folgende ist eine vereinfachte version des Codes:Sehen diese Antwort für eine Erklärung, wie diese Technik funktioniert.
You should maybe post a link to your questions on how this one works.
🙂 ... meinst du bei der Beantwortung darf ich einen link auf meine vorherigen Fragen (statt auf den code selbst) ? Ich vermute, dass wird nicht empfohlen, auf SO.questions
. Da meine letzten Fragen waren etwas im Zusammenhang mit diesem Mechanismus nur. So, jetzt habe ich einen guten halt.void
als 2. Standard-Typ für Standard -struct Foo
. Jetzt werden alle die nachfolgenden Spezialisierungen vonFoo
müssen den gleichen Typ 2. Zu diesem Zweck müssen wirvoid_
Mechanismus. Siehe auch den link von Xeo oben. Ich hatte die gleiche Frage gestellt wie deins: Unterschiedliche template-syntax zu finden, wenn argument eine Klasse ist oder nicht.Können Sie erstellen, die ein Merkmal
has_const_iterator
liefert einen booleschen Wert, und verwenden Sie, dass in der Spezialisierung.Sowas könnte funktionieren:
Und dann kann man sich spezialisieren, wie diese:
test(int)
statt, z.B.test()
?Nur sicherstellen, dass ich verstehe, wie die überlast-Auflösung hier funktioniert. Danke!test
eindeutig.Hier ist eine andere version eines Mitglieds Typ-trait-check:
Gibt es ein paar Möglichkeiten, dies zu tun. In C++03, Sie könnten Schub und
enable_if
definieren das Merkmal (docs, Quelle):In C++11, die Sie nutzen könnten Tick wie diese:
Auch mit Tick können Sie weiter zu verbessern die Eigenschaft, die tatsächlich erkennen, dass die
const_iterator
ist tatsächlich ein iterator, als auch. Also sagen wir, wir definieren eine einfacheis_iterator
Merkmal wie dieses:Können wir dann definieren
has_const_iterator
Merkmal, um zu überprüfen, dass dieconst_iterator
Typ mit demis_iterator
Merkmal wie dieses: