2015-02-20 3 views
0

Я учусь использовать контейнеры для карт, и я вижу логику, мы можем определить ключ и значение, когда мы вставляем какой-либо объект. Я также знаю, что мы можем вставлять пары с этими контейнерами и получать доступ к контенту через .first и .second. Однако я не могу понять этот кусок кода и нужен кто-то просветить меня, если вы можете:C++ map container [this]()

ClassA.h

#include"ClassB" 
#include"ClassC" 

class A 
{ 
public: 
    template<typename T> 
    void foo1(classC::ID id); 
private: 
    ClassB::Ptr someFunction(classC::ID id); 
private: 
    //map 
    std::map<class::ID, std::function<classB::Ptr()>> mapName; 
} 

template<typename T> 
void ClassA::foo1(classC::ID id) 
{ 
    mapName[id] = [this]() // <-------------- that [this]() ??? 
    {      // Is this calling for that 
          // function<class::Ptr()> inside map?? 
     //TODO 
    } 
} 

ClassB.h

#include"ClassC" 

class B 
{ 
    typedef std::unique_ptr<ClassB> Ptr; 
public: 
    classB(param1 from other classes , param2 from other classes); 
    .... 
} 

ClassC.h

namespace States 
{ 
    enum ID 
    { 
     foo, 
     foo1, 
     ... 
    } 
}   

Спасибо

+0

Этот код недопустим C++. Что такое 'class :: ID?' –

+0

Я назову его классом в качестве примера, на котором вы можете назвать его, как хотите, в моем примере это не класс, он является структурой с enum, поэтому struct :: ID, если это имеет смысл для вас. –

+0

@ user3763930 - является 'функцией' членом какого-либо класса? –

ответ

1

В вашем примере «странная часть» на самом деле не имеет ничего общего с картами и аксессуарами. Это {/ * TODO * /} является выражением лямбда C++ - простой функцией без аргументов с доступом к этому «указателю».

Использование карты в этом примере является полностью ординарным - вы просто получаете доступ к элементу с ключом [id] (создаете его, если он не существует), а затем назначьте эту функцию лямбда (значение). Если вы посмотрите на определение карты, вы увидите, что тип значения фактически является std :: function. Подробнее об этом шаблоне вы найдете в разделе http://www.cplusplus.com/reference/functional/function/

+0

Спасибо, что предоставили мне решение. –