我一直在试图弄清楚如何在我的类中公开一个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,但如果以这种方式可行,我不确定设置需要什么。有谁知道怎么做/可以建议一个替代方案?
由于
答案 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::tuple
和boost::python::tuple
之间)并直接使用这些属性公开def_readonly
或def_readwrite
。如果你有许多这样的属性要公开,那是值得的。
This有一个你可以适应的模板用于c ++→python转换(使用boost :: tuple而不是std :: pair),但除非你去c ++ 0x,否则你必须为不同的模板编写模板争论的数量。
如果您的属性是可读写的,另外从-python转换器定义,您可以在Web上找到示例。 Here是我用来定义通用sequence-std :: vector转换器的代码。在您的情况下,您必须检查python对象是一个序列,它具有正确数量的项目,您可以从每个项目中提取所需的类型;然后返回新的boost :: tuple对象。
HTH,edx。