gpt4 book ai didi

c++ - 在 C++ 中存储任意对象的列表

转载 作者:可可西里 更新时间:2023-11-01 18:00:23 25 4
gpt4 key购买 nike

在 Java 中,您可以拥有一个对象列表。您可以添加多种类型的对象,然后检索它们、检查它们的类型并针对该类型执行适当的操作。
例如:(如果代码不完全正确,我深表歉意)

List<Object> list = new LinkedList<Object>();

list.add("Hello World!");
list.add(7);
list.add(true);

for (object o : list)
{
if (o instanceof int)
; // Do stuff if it's an int
else if (o instanceof String)
; // Do stuff if it's a string
else if (o instanceof boolean)
; // Do stuff if it's a boolean
}

在 C++ 中复制此行为的最佳方法是什么?

最佳答案

boost::variant 类似于 dirkgently 对 boost::any 的建议,但支持访问者模式,这意味着以后添加特定于类型的代码会更容易。此外,它在堆栈上分配值而不是使用动态分配,从而使代码效率稍微高一些。

编辑: 正如 litb 在评论中指出的那样,使用 variant而不是 any意味着您只能保存来自预先指定的类型列表之一的值。这通常是一种优势,尽管在提问者的案例中可能是一个弱点。

这是一个示例(虽然没有使用访问者模式):

#include <vector>
#include <string>
#include <boost/variant.hpp>

using namespace std;
using namespace boost;

...

vector<variant<int, string, bool> > v;

for (int i = 0; i < v.size(); ++i) {
if (int* pi = get<int>(v[i])) {
// Do stuff with *pi
} else if (string* si = get<string>(v[i])) {
// Do stuff with *si
} else if (bool* bi = get<bool>(v[i])) {
// Do stuff with *bi
}
}

(是的,您应该在技术上使用 vector<T>::size_type 而不是 int 作为 i 的类型,而且您在技术上应该使用 vector<T>::iterator 而不是无论如何,但我试图保持简单。)

关于c++ - 在 C++ 中存储任意对象的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/607458/

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