C++ / Objective-C++ - 如何在 NSDictionary 中存储C++变量?

C++ / Objective-C++ - How can I store a C++ variable in an NSDictionary?

本文关键字:C++ 存储 变量 NSDictionary Objective-C++      更新时间:2023-10-16

我有一个类型为std::vector<std::bitset<128> >C++变量,该变量定义并填充在一个C++类中(从我的Objective-C++类调用)。

我想将此对象存储在NSDictionary中 - 或某种等效物。我显然不能简单地将std::vector<std::bitset<128> >添加到 NSDictionary 中,因为它不是id型。

所以我的问题是:我怎样才能实现相同的概念?如何将std::vector<std::bitset<128> >存储在各种字典中?我可以以某种方式将矢量对象包装在id类型中吗?即使它不是直接字典,我可以使用其他方法吗?我还需要它是可变的,所以我可以在运行时添加键/对象。

我见过std::map<std::string, std::string>,但我不确定这是否是我要找的。我也没有找到任何关于它是可变的例子。

有没有人知道如何实现这一目标?

实际上NSValue似乎是解决方案。 @Taum的建议在某些情况下是正确的(当您将对象存储在某个地方并确保指针正常工作时)。如果您创建了某个对象并且它的生存期有限,但您需要进一步推动此对象,请使用另一种NSValue方法

std::vector<std::bitset<128>> cppVector;
NSValue *value=[NSValue valueWithBytes:&cppVector objCType:@encode(std::vector<std::bitset<128>>)];

当您需要取回此值时:

std::vector<std::bitset<128>> cppVector;
[value getValue:&cppVector];

这也非常适合简单的结构。

您可以在NSValue对象中存储指向它的指针。您只需要注意拥有std::vector的内容以及何时应该free

存储:

std::vector<std::bitset<128>> *cppVector = myCppObject->methodReturningVector();
NSValue *value = [NSValue valueWithPointer:cppVector];
[myObjcDictionary setObject:value forKey:@"myKey"];

使用以下命令取回C++对象:

NSValue *value = [myObjcDictionary objectForKey:@"myKey"];
std::vector<std::bitset<128>> *cppVector = [value pointerValue]