gpt4 book ai didi

java - 在 C++ 中正确表示 Java 的 ArrayList
转载 作者:行者123 更新时间:2023-11-28 06:19:54 24 4
gpt4 key购买 nike

在 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.Anyboost::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/

24 4 0