1

我想用 Python 方式在 C++11 元组中实现一个简单的树。在 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;

}
4

2 回答 2

2

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

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

在 C++ 中,您不能在元组中保存任意树。编写一个树类(或者更好的是,一个类模板)。

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

于 2013-06-24T07:26:25.090 回答
1

这是不真实的,因为结果typeid().name是实现定义的。

const char* name() const noexcept;

返回:实现定义的 ntbs。

但是,在这里,您不能使用三元运算符,因为calc(l_child)将在编译时进行评估,因此如果l_child不是元组,则编译将失败。

您可以使用一些类型特征(或重载),因为tuple成员在编译时是已知的。

int calc(int value)
{
    return value;
}

template<typename Left, typename Right>
int calc(const std::tuple<char, Left, Right>& tuple)
{
   char symbol = std::get<0>(tuple);
   Left l_child = std::get<1>(tuple);
   Right r_child = std::get<2>(tuple);
   int l = calc(l_child);
   int r = calc(r_child);
   return l /*symbol*/, r;
}

活生生的例子

于 2013-06-24T07:11:44.190 回答