gpt4 book ai didi

c++ - 使用存储在 std::any 中的 std::map 然后通过 std::any_cast 访问

转载 作者:太空狗 更新时间:2023-10-29 20:08:35 27 4
gpt4 key购买 nike

我试图理解以下代码的结果:

template<typename KeyTypeT, typename ValueTypeT>
class MapWrapper {
std::any _container;

MapWrapper() {
_container = std::map<KeyTypeT, ValueTypeT>();
}

void insert(KeyTypeT key, ValueTypeT value) {
auto originalMap = std::any_cast<std::map<KeyTypeT, ValueTypeT>>(_container);
std::cout << "count is " << originalMap.size() << std::endl;

auto afterInsertion = std::any_cast<std::map<KeyTypeT, ValueTypeT>>(_container);
afterInsertion.insert(std::make_pair(key, value));
std::cout << "count is " << afterInsertion.size() << std::endl;

auto originalMapAfterInsertion = std::any_cast<std::map<KeyTypeT, ValueTypeT>>(_container);
std::cout << "count is " << originalMapAfterInsertion.size() << std::endl;


_container = afterInsertion;
auto originalMapAfterAssignement = std::any_cast<std::map<KeyTypeT, ValueTypeT>>(_container);
std::cout << "count is " << originalMapAfterAssignement.size() << std::endl;
}
};

结果如下:

Test Results:
count is 0
count is 1
count is 0 // why is this not 1?
count is 1

我的问题是为什么 _container在我进行分配之前不包含新插入的 key ?

std::any_cast将拷贝返回到 std::map<KeyTypeT, ValueTypeT> ?我本以为它会返回原始 map 。有没有办法修改存储在 std::any 中的原始 map ? ?

最佳答案

any_cast 的过载您正在使用的 (#2) 为您提供了 any 所持有的值的拷贝,而不是对它的引用。因此,您要插入的 mapany 所持有的 map 不同。

如果你想直接修改 any 持有的内容,你需要使用通过指针获取 any 的重载之一(即#5):

std::any a = 1;
int* p = std::any_cast<int>(&a); // <== like this
assert(p);
*p = 42;
assert(std::any_cast<int>(a) == 42);

或者您可以显式地向 any_cast 提供一个引用类型:

std::any a = 1;
std::any_cast<int&>(a) = 42; // <== int&, not int
assert(std::any_cast<int>(a) == 42);

另请注意,即使 any_cast 本身没有给您拷贝,您也可以通过以下方式自己制作:

auto originalMap = ...;

而不是引用结果。所以你可能想要:

auto& map = std::any_cast<std::map<...>&>(_container);

关于c++ - 使用存储在 std::any 中的 std::map 然后通过 std::any_cast 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52152664/

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