【问题标题】:Add a constructor to a boost::python vector_indexing_suite exposed class将构造函数添加到 boost::python vector_indexing_suite 暴露类
【发布时间】:2011-05-31 16:26:59
【问题描述】:

我想添加一个构造函数,这样我就可以做到这一点(我的字节在字符串中,因为我使用的是 python 2.6 和 2.7):

import myboostpymodule

d = 'serialised representation of a vector of some c++ objects'

vec = myboostpymodule.MyVectorType(d)

我重载了向量构造函数以接受一个字符串,该字符串将包含序列化的数据,而 MyVectorType 以boost::python::vector_indexing_suite 公开:

namespace bp = boost::python;
bp::class_< std::vector<SomeType> >("MyVectorType")
    .def(bp::vector_indexing_suite< std::vector<SomeType> >());
  • 是否可以不包装(通过子类化和 boost::python::wrapper<...>)向量来添加构造函数?
  • 我可以告诉 boost python 使用静态方法(或普通函数)作为构造函数吗?

重要的是我可以使用构造函数(而不是其他函数)从 python 创建向量。

我实际上这样做是因为我想让我的向量的 python 实例可腌制,并且我所有的 c++ 类型都已经具有明确定义的序列化(包括std::vector&lt;...&gt;),所以使用它来腌制整个向量似乎是明智的一次,而不是允许 python 独立地腌制每个元素1

1而且它似乎可能是一个更高性能的解决方案

【问题讨论】:

    标签: boost-python


    【解决方案1】:

    我认为使用boost::python::wrapper 不会对您有所帮助,因为您需要使用构造函数。我查看了boost::python::vector_indexing_suite 的定义,我认为您实际上可以定义自己的构造函数。

    boost::python 中有一个函数可以指定您自己的命名构造函数。它通常用于实现返回 shared_ptr 的工厂函数,但看起来像 python 中的常规构造函数。您可以查看http://wiki.python.org/moin/boost.python/HowTo#named_constructors_.2BAC8_factories_.28as_Python_initializers.29 的示例。

    如果复制你的列表并不昂贵,我认为你可以简单地这样做:

    using boost::python;
    typedef std::vector<SomeType> MyVectorType;
    
    MyVectorType makeMyVector(std::string myString)
    {
        return CreateMyVectorType(myString);
    }
    
    
    class_<MyVectorType>("MyVectorType")
        .def(vector_indexing_suite<MyVectorType>())
        .def("__init__", make_constructor(makeMyVector));
    

    但是,如果复制成本很高,您应该能够将其与链接中描述的 shared_ptr 工厂方法结合使用。

    【讨论】:

    • 谢谢;事实证明,make_constructor(...) 在任何情况下都需要返回类似shared_ptr 的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多