暴露boost :: tuple类的一部分来提升python

时间:2011-06-25 04:33:28

标签: c++ boost boost-python

我一直在试图弄清楚如何在我的类中公开一个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>())
        ;

然后使用来自python的get,但如果以这种方式可行,我不确定设置需要什么。有谁知道怎么做/可以建议一个替代方案?

由于

2 个答案:

答案 0 :(得分: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<...>())
    )

答案 1 :(得分:0)

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

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

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

HTH,edx。

P.S。我发现ackward已准备好转换器,也许你可以重用它。 Doc here