это на самом деле очень просто. py::bind_vector
- это просто оболочка вокруг class_
, поэтому вы можете добавлять к нему методы, как если бы вы добавляли их в обычный класс.
В вашем случае вы можете просто сделать
py::bind_vector<std::vector<my_type>>(m, "MyTypeVector")
.def("__repr__", [](const std::vector<my_type>& v) {// generate your string here;});
Поэтому для создания строкового представления я обычно определяю методы toString
и оператор <<
в моих классах c ++.
class BadData
{
// lots of stuff going on and removed here
virtual void
putMembers(std::ostream& out) const
{
out << "msg=" << >msg;
out << ", ";
out << "stack=" << stack;
}
virtual std::string
toString() const
{
std::ostringstream out;
out << "BadData(";
putMembers(out);
out << ")";
return out.str();
}
}
inline
std::ostream &operator<<(std::ostream& stream, const BadData &item)
{
stream << item.toString();
return stream;
}
У нас также есть оператор <<, определенный для коллекций stl </p>
template<class T> inline
std::ostream& operator << (std::ostream& os, const std::vector<T>& v)
{
std::ostringstream out;
out << "Vector[";
if (v.size() > 0) {
for (auto ii = v.cbegin(); ii != v.cend() -1 ; ++ii) {
out << *ii << ", ";
}
out << v.back();
}
out << "]";
os << out.str();
return os;
}
Итак, как только вы определили все эти операторы, ваш метод __repr__
может выглядеть как
.def("__repr__", [](const std::vector<my_type>& v) {
std::stringstream stream;
stream << v;
return stream.str();
})
или, в случае вашего настраиваемого класса, как
.def("__repr__", &::my_type::toString)