gpt4 book ai didi

Pybind11,如何在 std::vector 中调用对象的 __repr__?

转载 作者:行者123 更新时间:2023-12-01 21:31:00 30 4
gpt4 key购买 nike

我正在绑定(bind)一个类型 my_type

py::class_<my_type, std::shared_ptr<my_type>>(m, "MyType")
.def("__repr__", [](const my_type& o){return fmt::format("MyType: {}", o);});

以及带有

的 std::vector
py::bind_vector<std::vector<my_type>>(m, "MyTypeVector");

如果我希望 MyTypeVector 的输出为容器中每个对象的 MyType.__repr__ 序列,我该如何/应该在此处声明 MyTypeVector 的 __repr__ 方法?

最佳答案

其实很简单。 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 集合定义了运算符<<

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)

关于Pybind11,如何在 std::vector 中调用对象的 __repr__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62415760/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com