问题描述
||
我一直在尝试找出如何在我的课程中公开一个属性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,但如果可以通过这种方式实现,则我不确定设置需要什么。有谁知道该怎么做/可以建议替代方案吗?
谢谢
解决方法
您可以使用:
...
.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<...>())
)
, 除了使用上一个答案中所述的add_property
和编写访问器函数外,还可以考虑为元组(ple7ѭ和boost::python::tuple
之间)编写转换器,并用those9ѭ或def_readwrite
直接公开这些属性。如果您要公开很多这样的属性,那是值得的。
它有一个您可以适应c ++→python转换的模板(使用boost :: tuple而不是std :: pair),尽管除非您使用c ++ 0x,否则必须为不同数量的参数写出模板。
如果您的属性是可读写的,另外还定义了from-python转换器,则可以在网上找到示例。这是我用来定义通用sequence-std :: vector转换器的代码。对于您的情况,您必须检查python对象是否为序列,是否具有正确数量的项目,可以从每个项目中提取所需的类型;然后返回新的boost :: tuple对象。
HTH,edx。
附言我发现ackward已准备好转换器,也许您可以重复使用它。 Doc在这里