c++ - 带有 RTTI 的 C++11 元组中的树

标签 c++ c++11 tree tuples rtti

我想用 C++11 元组用 Python 方式实现一个简单的树。在 Python 中,我们可以使用 type(obj) 来检查运行时对象类型,并将不同类型的对象传递给一个函数,我已经为 calc() 编写了伪代码,如何在 c++ 中执行?

我尝试打印 typeid(child1).name() 和 typeid(tree).name(),它们是 'St5tupleIIciiEE' 和 'St5tupleIIcS_IIciiEES0_EE'。

我的环境是g++ 4.8.1。谢谢!

// pseudo code
int calc(tuple tree) {
  symbol = type(get<0>(tree));
  l_child = type(get<1>(tree));
  r_child = type(get<2>(tree));

  l = (type(l_child) == tuple) ? calc(l_child) : l_child;
  r = (type(r_child) == tuple) ? calc(r_child) : r_child;

  return l symbol r;
}

int main() 
{
  auto l_child = make_tuple('*', 1, 2);
  auto r_child = make_tuple('-', 5, 1);
  auto tree = make_tuple('+', l_child, r_child);

  cout << calc(tree) << endl;

}

最佳答案

Python 和 C++ 是截然不同的语言。 C++ 是静态类型的,Python 不是。将 Python 技术移植到 C++ 可能有效也可能无效。在这种情况下,它将不起作用。

在Python中,只有一个元组类,能够表示任何元组;在 C++ 中有无限多的元组类型,每一种都能够保存特定种类的数据。它们不可互换,正如您对 typeid 的实验恰本地证明的那样。

在 C++ 中,您不能在元组中包含任意树。编写树类(或更好的类模板)。

编辑:从技术上讲,如果将元组与指针和 union 相结合,就可以摆脱元组的影响。但是不推荐这样做。您的树将成为您的核心抽象,暴露诸如指针和 union 之类的低级细节会适得其反,应该避免。 C++ 的方式是写一个类,坚持下去。

关于c++ - 带有 RTTI 的 C++11 元组中的树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17269636/

相关文章:

c++ - 如何判断点云的单位是什么?

C++11 vector push_back 不明确

c++ - 使用内存映射文件在 C++ 中解析二进制文件太慢

c++ - 测试函数是虚函数还是构造函数

c++ - 将 boost::chrono::steady_clock::time_point 转换为 std::chrono::steady_clock::time_point

c++ - 可变参数模板之谜

javascript - 在javascript中将文件/目录结构转换为 'tree'

algorithm - 构建一棵树

java - 将 SWT 树中的项目在父级之间移动

c++ - 如何在 PHP 扩展中实例化全局 C++ 类?