decltype



  • Hi,

    kann mir jemand die funktionalitaet decltype in folgenden code erklaeren?

    template <class KEY_T, class VAL_T> class LRUCache{
    private:
            list<pair<KEY_T,VAL_T>> item_list;
            unordered_map<KEY_T, decltype(item_list.begin())> item_map;
    

    koennte ich auch einen iterator speichern?

    list<pair<KEY_T,VAL_T>>::iterator it;
    unordered_map<KEY_T, it> item_map;
    


  • Jo,

    typedef typename list<pair<KEY_T,VAL_T>>::iterator it; // man beachte das typename
    unordered_map<KEY_T, it> item_map;
    

    macht das gleiche wie

    unordered_map<KEY_T, decltype(item_list.begin())> item_map;
    

    Aber eines ist kürzer, lesbarer und muss nicht angepasst werden, wenn man den Typ von item_list auf einen vector/deque ändert, weil man feststellt, dass das doch schneller ist.



  • vector/deque sollte man hier keine verwenden, da die iteratoren unglueltig werden wenn ich neue element in den vector order deque hinzufuege oder loesche?

    warum klappt die def. des iterators nicht ohne dem typename, wuerde das mit c++98 compilieren?

    typedef list<pair<KEY_T,VAL_T>>::iterator it;
    


    1. Nein, deque invalidiert Iteratoren nur, wenn in der Mitte (d.h. nicht am Rand) eingefügt wird.

    2. Ne, das typename ist Pflicht. In C++98, wie in C++11. Kann sein, dass der MSVC das durchgehen lässt, aber das dürfte er eigentlich nicht. Denn "list<pair<KEY_T,VAL_T>>::iterator" könnte ja rein theoretisch auch eine Konstante sein (wie max_size oder so). http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords



  • typename braucht man nur bei verschachtelten abhängigen typen:

    struct Foo
    {
    	typedef int Type;
    };
    template<typename T>
    void f1()
    {
    	T Instance; // Kein typename weil T nicht verschachtelt ist
    }
    void f2()
    {
    	Foo::Type Instance; // Kein typename weil Foo nicht abhängig ist
    }
    template<typename T>
    void f3()
    {
    	typename T::Type Instance; // typename weil T abhängig ist und weil Type verschachtelt ist
    }
    


  • decltype gekommt den type zur compiletime?



  • cppcoder1 schrieb:

    decltype gekommt den type zur compiletime?

    ja. anders wäre das gar nicht möglich mit einem starken typensystem wie es c++ hat.


  • Mod

    asdfasdf schrieb:

    cppcoder1 schrieb:

    decltype gekommt den type zur compiletime?

    ja. anders wäre das gar nicht möglich mit einem starken typensystem wie es c++ hat.

    Es gibt da auch noch so Späßchen wie dynamic_cast und typeid, auch wenn sie kaum benutzt werden.


  • Mod

    Und noch allgemeiner:

    decltype(std::begin(item_list))
    

    Es gibt da auch noch so Späßchen wie dynamic_cast und typeid, auch wenn sie kaum benutzt werden.

    Es geht hier um Template-Argumente.


Anmelden zum Antworten