【问题标题】:exposing boost::tuple part of class to boost python暴露类的 boost::tuple 部分来提升 python
【发布时间】:2011-06-25 04:33:27
【问题描述】:

我一直试图弄清楚如何在我的类中公开一个 boost::tuple 属性。元组定义如下:

typedef boost::shared_ptr<Action> action_ptr;
typedef boost::tuple<BattleCharacter*, action_ptr > ActionTargetTuple;

它包含在一个定义如下的类中:

class Action : public Cloneable<Action>
{
     public:
          //Irrelevant Code Omitted
          std::vector<ActionTargetTuple> Targets;
}

在搜索如何将 boost::tuple 转换为 python 元组时,我看过很多文章,但这不是我想要做的。我希望能够访问 Action 类中存在的元组。 (我知道怎么做矢量部分)。

class_<Action, std::auto_ptr<ActionWrapper> >("Action")
        .def("Targets", &Action::Targets)
    ;

我就像上面一样简单地公开它。我想我可以通过下面的一些变化来暴露它:

 class_<ActionTargetTuple>("ActionTargetTuple")
        .def("get", &ActionTargetTuple::get<int>, return_value_policy<reference_existing_object>())
        ;

然后使用 get from python,但是如果可以通过这种方式进行,我不确定设置需要是什么。有谁知道如何做到这一点/可以提出替代方案?

谢谢

【问题讨论】:

    标签: c++ boost boost-python


    【解决方案1】:

    你可以使用:

    ...
        .add_property("Targets", & ActionTargetTuple::get, &ActionTargetTuple::set)
    

    在 c++ 中使用 getter/setter 方法创建读写属性

    如果您想控制所有权:

    namespace bp = boost::python;
    ...
        .add_property("Targets",
            bp::make_function(&ActionTargetTuple::get, bp::return_value_policy<...>()),
            bp::make_function(&ActionTargetTuple::set, bp::return_value_policy<...>())
        )
    

    【讨论】:

      【解决方案2】:

      除了使用add_property(如上一个答案中所述)和编写访问器函数之外,您还可以考虑为您的元组编写转换器(在boost::tupleboost::python::tuple 之间)并直接使用def_readonly 或@987654329 公开这些属性@。如果您有许多这样的属性要公开,那是值得的。

      This 有一个模板可以适应 c++→python 转换(使用 boost::tuple 而不是 std::pair),但除非你使用 c++0x,否则你必须写出不同数量的模板论据。

      如果您的属性是可读写的,另外定义 from-python 转换器,您可以在网上找到示例。 Here 是我用来定义通用 sequence-std::vector 转换器的代码。在您的情况下,您必须检查 python 对象是否是一个序列,它是否具有正确数量的项目,您可以从每个项目中提取所需的类型;然后返回新的 boost::tuple 对象。

      HTH,编辑

      附:我发现ackward 已经准备好转换器,也许你可以重复使用它。 Doc here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多