私は自分自身のかなりのプリンタを提供しているオブジェクトのstd :: setを含むクラス用のきれいなプリンタを作成しようとしています。私はかなり-印刷クラス「FooContainer」のオブジェクトをできるようにしたいGDB:STLコンテナを含むPretty-Printクラス
#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
}
:とても基本的に、これは私のようにC++のコードがどのように見えるかです。だから、私はこれらのように何とか見えるプリティプリンタたい:
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は私にエラーを与える:FooContainerPrinterは、内部のメンバーへのアクセス権を持っているよう
(gdb) p c
Python Exception <class 'TypeError'> 'gdb.Value' object is not iterable:
$7 =
に見えますstd :: setの値を返します。それを反復することはできません。 本当には、そのstd :: setの背後にある赤黒の木を横切ることを避けるのが好きです。これを達成するためのすてきなトリックがありますか?
Tomの最後の点については、 'RbtreeIterator'型(GCCのRBツリーをツリー内のすべてのノードでPython iterablesに変える)とその名前が意味する' get_value_from_Rb_tree_node'関数を参照してください。おそらく、それらからコードを抽出する必要はなく、再利用するだけです。私は願います。 –
これは良い考えです。将来libstdC++に変更があった場合、あなたのコードに適応する必要があるという警告があります。私はこのコードが便利なヘルパークラスを使用していたことを忘れていました... –
答えをありがとう。しかし、私は、デフォルトのかわいいプリンタをハイジャックして、私が望むことをやり遂げる方法を見つけたと思う。詳細は私の答えを見てください。 –