überprüfen Sie den Typ des Elements in der stl-container - c++
wie bekomme ich den Typ der Elemente, die von einem STL-container?
- Was genau versuchst du hier zu tun? Seit C++ ist statisch typisiert, sollten Sie in der Regel wissen, welche Art der Elemente (vector<int>, zum Beispiel, hält ints). Wenn Sie erklären sollten, warum Sie nicht wissen, was die Typen sind und was Sie wollen, Sie zu benutzen, das würde helfen, die Frage zu beantworten.
- Thornley:
template <typename T> void foo(std::template<T> arg){ /* Here, we don't know what the elements type is */ }
ich denke, es ist eine ziemlich häufige situation. - An diesem Punkt wahr. Aber an diesem Punkt foo() ist nur ein Konzept. Aber sobald Sie verwenden foo() Sie kennen den Typ.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für Container im Allgemeinen wird es
X::value_type
. Für assoziative Container wird esX::mapped_type
(X::value_type
entsprichtpair<const Key,T>
). Es wird nach Kapitel 23 der C++ - Standard.Um zu überprüfen, dass die Typen gleich sind, könnten Sie
boost::is_same
.Prüfen, ob die beiden Typen identisch sind, erreicht werden können wie diese (ohne RTTI, Wert verwendbar ist zur compile-Zeit):
(Dies ist im Grunde, wie
boost::is_same
funktioniert, minus workarounds für bestimmte Compiler.)In welchem Sinne?
Vielleicht mit Hilfe von RTTI und typeid()?
Wahrscheinlich verwenden Sie die container::valuetype, wo container ist der name des Containers (zum Beispiel std::vector)
Alek
Verwenden Sie so etwas wie dieses:
Alek
Müssen Sie uns mehr Kontext. Wenn Sie meinen, Sie wollen den Wert bekannt zu compile-Zeit, so dass es leicht zu ändern, verwenden Sie
container::value_type
.Wenn das, was du meinst, ist, dass der Behälter kann halten den verschiedenen konkreten (abgeleiteten) Datentypen und Sie wollen wissen, Sie zur Laufzeit dann sollten Sie vielleicht überdenken Sie Ihre Herangehensweise. In der objektorientierten Programmierung versteckt sich der Typ zur Laufzeit ist manchmal ein leistungsfähiges Konzept, weil es bedeutet, dass Sie weniger Annahmen über das, was Sie gerade arbeiten. Natürlich können Sie RTTI, aber es gibt wahrscheinlich einen besseren Weg: wir brauchen mehr Kontext zu erzählen.
Wenn Sie vergleichen möchten-Typen, dann sind Sie wahrscheinlich die Bezeichnung der Laufzeit Weg. C++ unterstützt Polymorphie, das ist im wesentlichen, dass Typ-Vergleich Sie sind auf der Suche nach -- aber gebaut in der Sprache. Sie möchten, führen Sie einen anderen Satz von Anweisungen basierend auf dem Typ? Polymorphismus ermöglicht die Ausführung einer anderen Funktion auf der Grundlage des Typs des Objekts. Sie müssen nicht schreiben einen einzigen extra-Zeile code-nur abgeleitet aus einer gemeinsamen Basis.
gegeben, die Arten bekannt sind statisch, können Sie prüfen, Sie sind die gleichen, statisch ohne Verwendung von rtti durch die Verwendung von template-Spezialisierung. z.B. so etwas wie http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html oder wenn boost nicht verfügbar ist, Rollen Sie Ihre eigenen