在 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 http://www.boost.org/doc/libs/1_38_0/doc/html/variant.html类似于德克轻轻的建议boost::any
,但支持访问者模式,这意味着以后添加特定于类型的代码会更容易。此外,它在堆栈上分配值而不是使用动态分配,从而导致代码效率稍高。
EDIT:正如 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
for i
的类型,从技术上讲你应该使用vector<T>::iterator
无论如何,但我试图保持简单。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)