Natürlich können Sie die zu überprüfenden Methoden und Typen ändern.
Wenn Sie nur STL-Container erkennen möchten (dh std::vector, std::listusw.) sollten Sie so etwas tun.
AKTUALISIEREN. Wie @Deduplicator feststellte, erfüllt der Container möglicherweise nicht die AllocatorAwareContainer-Anforderungen (z. B.: std::array<T, N>). Deshalb check on T::allocator_type ist nicht notwendig. Aber Sie können alle/alle ankreuzen Container Anforderungen in ähnlicher Weise.
is_cointainer_helper kann heutzutage durch std::void_t ersetzt werden
– Arvid
20. Dezember 17 um 20:43 Uhr
Für beide is_container Strukturen, void wird als zweites verwendet Parameter. Nach Tests scheint es, dass es unabhängig vom Typ funktioniert, wenn dies derselbe Typ ist: template<typename T, typename _ = int> und is_container_helper<...>, int>. Warum so? Warum funktioniert es nicht, wenn wir verwenden void und intoder int und void?
– Maxime Recuerda
20. November 18 um 15:57 Uhr
Weil Sie verwenden is_container< Type > welches ist is_container< Type, void > die nicht spezialisiert ist und die Standardimplementierung verwendet wird: std::false_type
– Nie wieder
23. November 18 um 9:02 Uhr
EIN Container ist vielleicht kein AllocatorAwareContainer.
Das Problem mit Ihrem Ansatz ist, dass der Typ U ist in dem Kontext, in dem es verwendet wird, nicht ableitbar.
Und für is_container? einfach testen, ob es eine hat allocator_type?
– TemplateRex
20. August 2012 um 18:31 Uhr
@rhalbersma: Das Problem ist, was Sie definieren is_container ist… Ist meine Hand gerollt single_list ein Container? ist std::string ein Container? Macht die Tatsache, dass es einen Allocator hat, ein Objekt zu einem Container?
– David Rodríguez – Dribeas
20. August 2012 um 18:33 Uhr
Pro is_containerviele Leute suchen nur begin und end Funktionen und Verwendung is_iterabledas ist (meistens) das, was Sie sowieso wirklich wissen mussten.
– Muhende Ente
20. August 2012 um 19:08 Uhr
@MooingDuck: Wo finde ich is_iterable?
– Frank
6. Dezember 2012 um 19:40 Uhr
Es ist erwähnenswert, dass die ungetestete „using“-Syntax in diesem Fall nur schlecht funktioniert. Es wird versucht, eine Instanziierung des abhängigen Typs “T::value_type” zu erzwingen, was mit einem Kompilierfehler fehlschlägt, wenn T so etwas wie int ist.
– ltd
24. Februar 15 um 19:39 Uhr
Während die anderen Antworten hier, die versuchen zu erraten, ob eine Klasse ein Container ist oder nicht, für Sie funktionieren könnten, möchte ich Ihnen die Alternative vorstellen, den Typ zu benennen, für den Sie true zurückgeben möchten. Sie können dies verwenden, um beliebige zu erstellen is_(something) Eigenschaften Typen.
template<class T> struct is_container : public std::false_type {};
template<class T, class Alloc>
struct is_container<std::vector<T, Alloc>> : public std::true_type {};
template<class K, class T, class Comp, class Alloc>
struct is_container<std::map<K, T, Comp, Alloc>> : public std::true_type {};
Und so weiter.
Sie müssen einbeziehen <type_traits> und welche Klassen Sie Ihren Regeln hinzufügen.
Auf diese Weise können Benutzer ihre eigenen Container hinzufügen, indem sie sich teilweise spezialisieren. Verwenden Sie für is_vector et al. nur eine teilweise Spezialisierung wie oben, aber beschränken Sie sie auf nur einen Containertyp, nicht viele.
netter Stunt. Aber das wird “machen” std::string (zum Beispiel) auch in einen Behälter . Mit dem oben genannten: is_container<std::string>::value ist true
– Benutzer5560811
27. Juni 18 um 08:43 Uhr
so wie es sollte! stackoverflow.com/questions/17259595/…
– Arvid
28. Juni 18 um 9:45 Uhr
Ich habe bis jetzt geglaubt std::string ist kein Standardcontainer? Obwohl ich zustimme Dieser Text.
– Benutzer5560811
28. Juni 18 um 9:55 Uhr
.
7584700cookie-checkWie schreibe ich ein Typmerkmal `is_container` oder `is_vector`?yes