我想写一个漂亮的打印机为一个类包含一个std ::对象集,我也提供我自己的漂亮的打印机。基本上,这是我的C++代码的样子:GDB:漂亮的打印类包含STL容器
#include <set>
#include <iostream>
#include <cassert>
class Foo {
public:
int x;
bool operator<(const Foo & rhs) const {
return this->x < rhs.x;
}
};
class FooContainer {
public:
std::set<Foo> content;
};
int main(int argc, char **argv) {
FooContainer c;
Foo f1 {1};
Foo f2 {2};
c.content.insert(f1);
c.content.insert(f2);
assert(false); // hand over to gdb
}
我希望能够漂亮地打印类“FooContainer”的对象。所以,我想漂亮的打印机,看起来在某种程度上像这样:
class FooPrinter(object):
def __init__(self, val):
self.val = val
def to_string(self):
return "X: " + str(self.val['x'])
class FooContainerPrinter(object):
def __init__(self, val):
self.val = val
def to_string(self):
res = ""
for foo in self.val['content']:
res += " " + FooPrinter(foo).to_string()
return res
然而,尝试这些,GDB给我一个错误:
(gdb) p c
Python Exception <class 'TypeError'> 'gdb.Value' object is not iterable:
$7 =
它看起来像FooContainerPrinter只能访问内部成员一个std :: set,并且不能迭代它。我会真的喜欢避免必须遍历std :: set后面的红黑树。有没有一个巧妙的诀窍来实现这一目标?
关于Tom的最后一点,请参阅'RbtreeIterator'类型(它将GCC的RB树转换为树中所有节点上的Python迭代)和'get_value_from_Rb_tree_node'函数,它的名字就意味着它。您可能不需要从中提取代码,只需重新使用它们即可。我希望。 –
这是一个好主意,但有一点需要注意的是,如果libstdC++发生变化,您的代码将来可能不得不适应。我忘记了这段代码使用了一个方便的帮助类... –
感谢您的答案。不过,我想我通过劫持默认的漂亮打印机找到了我想做的事情。详情请参阅我的回答。 –