2016-10-10 1 views
1

Gibt es eine Möglichkeit, die value_type von einer Variablen vom Typ std::map<K,V>C++ 11 get std :: map value_type von einer variablen

Zum Beispiel zu bekommen:

class Foo{ 
    private: 
     std::map<int,double> myMap; 
    public: 
     void Bar(const std::map<int,double>& m) 
     { 
      using PairType = m::value_type; //How to enable something like this? 
      std::vector<PairType> vec(m.size()); 
      read_ints_and_doubles(&vec, m.size()); //expects a void* (legacy lib I'm using) 
     } 
}; 

Natürlich weiß ich, ich kann std::map<int,double>::value_type, aber ich möchte, dass dies offen für zukünftige Änderungen ist.

Ich dachte über die Verwendung von using MyMapType = std::map<int,double> und dann einfach MyMapType überall, aber ich möchte das nicht tun und es scheint mir, dass es eine Möglichkeit gibt, diese Informationen aus der Variablen selbst zu bekommen, da dies alles statische Informationen ist und ich sehe nicht, warum ich nicht auf diese Info zugreifen kann.

EDIT: Diese Frage ist ganz anders als die dup vorgeschlagen: Declare variables that depend on unknown type in template functions da ich versuche, keine Variable zu deklarieren, und die Art ist bekannt.

+1

Funktioniert 'MyMapType :: value_type' nicht für Sie? –

+0

oh Entschuldigung, ich meinte, dass ich weiß, dass es mit MyMapType arbeiten kann, aber ich möchte es mit der Variablen – ZivS

+0

machen Ich werde meine Frage bearbeiten – ZivS

Antwort

5

können Sie verwenden decltype (wandbox example):

using PairType = decltype(m)::value_type; 

In dem obigen Code-Schnipsel, decltype(m) auf die Art der m auswertet.


In Ihrem speziellen Fall, sollten Sie std::remove_reference_t verwenden, um die Referenz aus dem ausgewerteten Typ entfernen - decltype die ausgewertet Typ nicht automatisch „Zerfall“ der Fall ist.

  • C++ 14 Beispiel:

    using PairType = decltype(m)::value_type; 
    std::vector<std::remove_reference_t<PairType>> vec(m.size()); 
    
  • C++ 11 Beispiel (on wandbox):

    using PairType = decltype(m)::value_type; 
    using RemoveRefPairType = typename std::remove_reference<PairType>::type; 
    std::vector<RemoveRefPairType> vec(m.size()); 
    
+0

@SingerOfTheFall: Ja, es kann, danke! –

+0

Danke, aber das funktioniert nicht für mein Beispiel. Ich bekomme einen 'Fehler: declltype wertet 'const std :: map &', was keine Klasse oder Aufzählungstyp ist ' – ZivS

+0

Entfernen Sie die Referenz mit [' std :: remove_reference_t'] (http: //en.cppreference. com/w/cpp/types/remove_reference). –

2

decltype wird Ihnen dabei helfen, Beispiel:

int main() 
{ 
    std::map<int, int> m; 
    using mytype = decltype(m)::value_type; 
    mytype r = {1, 5}; // std::pair<const int, int> 
}