【问题标题】:c++ map container [this] () [duplicate]c ++地图容器[this]()[重复]
【发布时间】:2015-02-20 14:06:56
【问题描述】:

我正在学习使用地图容器,我可以看到逻辑,我们可以在插入任何对象时定义键和值。我也知道我们可以使用这些容器插入对,并且可以通过 .first 和 .second 访问内容。但是我无法理解这段代码,如果可以的话,需要有人来启发我:

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,
        ...
    }
 }        

谢谢

【问题讨论】:

  • 此代码不是有效的 C++。什么是class::ID?
  • 我将其命名为类作为示例,您可以将其命名为任何您想要的名称,在我的示例中,它不是一个类,它是一个带有枚举的结构,所以 struct::ID 如果有意义的话给你。
  • @user3763930 - function 是某个班级的成员吗?
  • 不,我没有任何错误,我实际上是从 sfml 书中的示例代码中学习的,但我没有发布确切的代码块,但我可以更改它。所以这个话题奇怪地使用 [] 不适合我的答案。谢谢
  • @user3763930:关键是,您向我们展示的代码无法编译,因为class 是关键字。即使你使用了别的东西,比如Example,它仍然不是一段可编译的代码。也就是说,你给我们看的代码不可能是真实的,如果我们没有看到,就不可能知道代码是什么意思……

标签: c++ dictionary this containers


【解决方案1】:

在您的示例中,“奇怪的部分”实际上与地图和访问器无关。 this{/*TODO*/} 是一个 C++ lambda 表达式 - 一个没有参数的简单函数,可以访问“this”指针。

在这个例子中,map 的使用完全是有序的——你只需使用键 [id] 访问元素(如果它不存在则创建它),然后将 lambda 函数(值)分配给这个键。如果您查看映射的定义,您可以看到,值类型实际上是 std::function。有关此模板的更多信息,您可以在 http://www.cplusplus.com/reference/functional/function/

下找到

【讨论】:

  • 感谢您为我提供解决方案。
猜你喜欢
  • 2020-09-08
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多