java - 在 C++ 中正确表示 Java 的 ArrayList<Object>

标签 java c++ oop

在 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/

相关文章:

c++ - c++ std 中的字符串类是如何工作的?

c++ - WinApi OpenProcess 错误 87

c# - 面向对象设计问题

java - 在具体类需要数据库连接的项目上实现 DAO

java - 重构 Java 代码以使其可重用

java - 比特流客户端 : ttorrent doesn't work

Java Hashmap Iterator 条件问题

java - Hadoop Junit 测试面临编译错误

c++ - 无法从 SFML 实现纯虚函数

oop - 如何打破我的程序编码习惯?