gpt4 book ai didi

c++ - 具有映射的现代方式,该映射可以指向或引用已在堆栈上分配的不同类型的数据

转载 作者:行者123 更新时间:2023-12-01 15:10:58 26 4
gpt4 key购买 nike

使用原始指针,可以这样实现:

#include <iostream>
#include <string>
#include <map>

using namespace std;

class base {
public:
virtual ~base(){}
};

class derived1 : public base {
public:
virtual ~derived1(){}
derived1(const int& other) : val(other) {}
int val;
};

class derived2 : public base {
public:
virtual ~derived2(){}
derived2(const float& other) : val(other) {}
float val;
};


int main()
{
derived1 dataA = 4;
derived2 dataB = 3.0f;

std::map<std::string, base*> mapOfPointersToData; //Needs to be a pointer because it can be of type deribed1 or derived2. Cant be smart as pointing to stack memory
mapOfPointersToData["dataA"] = &dataA;
mapOfPointersToData["dataB"] = &dataB;

base* result = mapOfPointersToData["dataA"];

std::cout << dynamic_cast<derived1*>(result)->val << std::endl;

return 0;
}

这行得通,但有人告诉我,我们应该避免使用原始指针,而建议使用智能指针或引用。

对象永远不能为null,因此使用引用是有意义的。我们可以通过使用变体来解决映射只能存储一种数据类型的问题:
int main()
{
derived1 dataA = 4;
derived2 dataB = 3.0f;

std::map<std::string, std::variant<derived1, derived2>&> mapOfPointersToData; //Cant be constructed
mapOfPointersToData["dataA"] = dataA;
mapOfPointersToData["dataB"] = dataB;

auto result = mapOfPointersToData["dataA"];

std::cout << std::get<derived1>(result).val << std::endl;

return 0;
}

但这给出了错误
error: value-initialization of reference type ‘std::variant<derived1, derived2>&

那么,存储对不同类型栈数据的引用的最佳方法是什么?

最佳答案

This works, but I have been told that we should avoid the use of raw pointers in favour of smart pointers or references.



仅当原始指针负责拥有它们所指向的内容时,才不鼓励使用原始指针(本质上,如果您必须记住 delete或以其他方式释放它们)。在这里,对象具有 automatic storage duration,并且指针不负责清理它们。这是原始指针的合理用例。

The objects can never be null, so it makes sense to use a reference.



如果您使用 nullptr 搜索 map ,则 map 中的对象可能是 operator[]。该运算符将添加所有未能找到的元素,并将其值初始化(将其初始化为 nullptr的指针)。如果您不想用空指针膨胀 map ,则可以使用 find 代替。

So what is the best way to store references to stack data, that can be of different types?



您可能正在寻找 std::reference_wrapper ,它将引用包装在适合容器的对象中。但是使用 base*似乎已经是一个不错的解决方案,因为您的 map 不拥有它最终指向的对象。

关于c++ - 具有映射的现代方式,该映射可以指向或引用已在堆栈上分配的不同类型的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60216992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com