Предположим, у меня есть простой struct
:
struct S {
int index;
const std::vector<int>& vec;
};
Я хочу написать симпатичный принтер для GDB, который бы отображал vec[index]
для объекта типа S
,
Вот как я это делаю сейчас:
class SPrinter:
def __init__(self, name, val):
self.val = val
def to_string(self):
i = int(self.val['index'])
ptr = self.val['vec']['_M_impl']['_M_start'] + i
return str(ptr.dereference())
Есть ли более простой способ доступа к данному элементу std::vector
? Можно ли позвонить operator[]
(в ГБД я могу сделать p s.vec[0]
и получить то, что я хочу)? Я бы хотел, чтобы мой принтер не зависел от конкретной реализации std::vector
,
После прочтения этот ответ, Я придумал следующее решение:
def get_vector_element(vec, index):
type = gdb.types.get_basic_type(vec.type)
return gdb.parse_and_eval('(*(%s*)(%s))[%d]' % (type, vec.address, index))
class SPrinter(object):
def __init__(self, name, val):
self.val = val
def to_string(self):
return get_vector_element(self.val['vec'], int(self.val['index']))
Других решений пока нет …