Wie man element-Typ aus der STL-container-Instanz?
Weiß ich über value_type, key_type... aber Sie arbeiten auf Typen, nicht auf Instanzen.
Ich versuchte
Sachen wie :
std::set<uint64_t> mySet;
decltype (mySet)::value_type pos;
Aber es funktioniert nicht.
EDIT: ich nutze VS 2010.
EDIT2: der Verwendungszweck dieser code war eine Art zu geben, es zu boost::lexical_cast<>
gibt es einen workaround, der es ermöglicht, dass ?
Ich möchte so etwas wie dies:
mySet.insert(boost::lexical_cast<decltype(mySet)::value_type>(*it));
//it is a iterator in vector of strings
EDIT3 : das funktioniert:
mySet.insert(boost::lexical_cast<decltype(mySet)::value_type>(*it));
- Was bedeutet "funktioniert nicht" bedeutet?
decltype (mySet)::value_type pos;
korrekt ist. Da ist ein Fehler in der 2010-compiler von Microsoft, die nicht decltype, gefolgt von einer::
(siehe Frage als Duplikat)- mögliche Duplikate von decltype und der scope-operator in C++
- Da man offenbar den Umgang mit einer buggy-compiler, ein möglicher workaround wäre so etwas wie:
auto pos = *(mySet.begin());
- Wenn das, was Sie zu tun versuchen tatsächlich funktioniert, es scheint mir, dass Ihre Klammern an der falschen Stelle. Versuchen
(decltype mySet)::value_type pos;
und lassen Sie uns wissen, was passiert. (DISCLAIMER: ich habe noch nie verwendetdecltype
in meinem eigenen C++ - Programme, so ist dies nur eine Vermutung.) - Ein workaround:
typedef decltype(mySet) T; T::value_type pos;
- Verwenden Sie nicht
uint64_t
es sei denn, Sie haben eine absolute Voraussetzung, dass die Größe sein genau 64 bit. Verwendenuint_least64_t
wird; stattdessen gibt es auf Systemen, die nicht über ein 64-bit-integer-Typ haben aber etwas größer. - Ich benutze MSVC 10 🙁
- Ich Frage mich, ob die Leute auf der C-standard-Komitee wurden gesponsert von Tastatur-Herstellern, wenn Sie definiert
<stdint>
. In der Theorieuint_least64_t
sollte verwendet werden, mehr alsuint64_t
, aber es wird es nie sein. - Ich hoffe, es wird werden, da
uint64_t
ist nicht erforderlich, um zu existieren. Aber ich Stimme zu: die Namen der meisten nützlichsten langatmig. - tnx, das funktioniert. 😀
- Es gibt auch eine interessante (für mich) einen Knick in der Norm, dass
int64_t
wenn es vorhanden ist, wird garantiert, 2-Komplement, in der Erwägung, dassint_least64_t
nicht. So gibt es eine zusätzliche Berücksichtigung bei der Auswahl Ihrer unterzeichneten geben, das nicht gelten zu unsigned.
Du musst angemeldet sein, um einen Kommentar abzugeben.
decltype (mySet)::value_type
korrekt ist. Stellen Sie sicher, dass Sie C++11-Modus aktiviert, in Ihrem compiler. Wenn Sie haben, dann ist es ein compiler-bug.Eine mögliche Problemumgehung besteht in der Verwendung der Identität metafunction:
decltype
, aber hier ist eine etwas böse Weg, dass macht VS2010 istdecltype
richtig:#define decltype(...) std::identity<decltype(__VA_ARGS__)>::type
Ich würde es tun, die andere Weise herum:
Hier ist ein einfaches Beispiel für die print-Methode druckt Elemente der priority queue:
Das problem ist, dass nach dem drucken von allen Elementen die Warteschlange leer ist.
Wiederherstellen der Warteschlange ursprüngliche Zustand, den wir hinzufügen-vector-container. Der Typ
von queue-Elementen ist, die sich aus der Warteschlange: