我想寫一個漂亮的打印機爲一個類包含一個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++發生變化,您的代碼將來可能不得不適應。我忘記了這段代碼使用了一個方便的幫助類... –
感謝您的答案。不過,我想我通過劫持默認的漂亮打印機找到了我想做的事情。詳情請參閱我的回答。 –