在 Java 中,我使用
ArrayList<Object> contents = new ArrayList<Object>();
持有通用类型,元素不应该是同一类型。
例如,我做了这样的事情:
int n = 1991;
String str = "mfso";
contents.add(n);
contents.add(str);
现在,我想用 C++ 做同样的事情,但我没有发现任何相似之处。 我试过 `void**,但它非常像 C,而且很难驾驭。我想要一个更具 OO flavor 的解决方案。
我希望你能给我展示不同的解决方案,并简要地告诉我优缺点。
提前致谢
周克岑
最佳答案
C++ 没有像 Java 的 Object
类这样的“通用基类”。因此,必须以其他方式创建此机制。
对于一个真正的“任何”容器,唯一通用的解决方案是使用来自 Boost.Any 的 boost::any
之类的东西。库(某些编译器也可能支持 std::experimental::any
, as described here )。使用它显然会产生开销,但我认为这是您准备接受的东西。
这里是你如何使用它:
#include <vector>
#include <string>
#include <iostream>
#include <typeinfo>
#include <boost/any.hpp>
int main() {
std::vector< boost::any > contents;
int n = 1991;
std::string str = "mfso";
contents.emplace_back(n);
contents.emplace_back(str);
for(auto& x : contents) {
if( x.type() == typeid(int) )
std::cout << " Int: "
<< boost::any_cast< int >(x) << std::endl;
else if( x.type() == typeid(std::string) )
std::cout << " String: "
<< boost::any_cast< std::string& >(x) << std::endl;
};
};
理想情况下,如果您可以通过其他方式解决问题,则应避免使用类似 boost::any
的方法。例如,如果所有类型的对象都通过某个基类相关(或可以相关),那么您应该使用它。或者,如果您希望存储在容器中的类型数量有限,那么您可以改用 boost::variant
之类的东西(参见 docs )。
关于java - 在 C++ 中正确表示 Java 的 ArrayList<Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29502254/