使用调用策略boost::python创建属性

2024-10-01 07:28:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的C++类,我想把它们暴露给Python。在

class PlainOldData
{
     ...
};

class FancyClass
{
public:
    const PlainOldData& GetMyPOD() {return myPOD;}
private:
    PlainOldData myPOD;
};

因为我希望python类是python类,所以我希望将myPOD公开为一个属性。但是,当我尝试执行以下操作时:

^{pr2}$

我得到以下错误:error C2027: use of undefined type 'boost::python::detail::specify_a_return_value_policy_to_wrap_functions_returning<T>'

但是,如果我尝试指定呼叫策略,例如:

    class_<FancyClass>("FancyClass", init<>())
        .add_property("myPOD", &FancyClass::GetMyPOD, return_value_policy<copy_const_reference>());

我收到了一条难以置信的长错误消息。在

是否可以将此函数作为属性公开;我是否做错了什么?在


Tags: return属性value错误policyerrorprivatepublic
1条回答
网友
1楼 · 发布于 2024-10-01 07:28:48

与Python的^{}如何传递Python可调用对象类似,^{}函数可以接受可以用CallPolicies创建的Python可调用对象,例如从^{}返回的对象。在

例如,原始代码中的属性可以公开如下:

class_<FancyClass>("FancyClass", init<>())
  .add_property("myPOD", make_function(&FancyClass::GetMyPOD,
    return_value_policy<copy_const_reference>()));

下面是一个完整的最小示例:

^{pr2}$

交互式使用:

>>> import example
>>> spam = example.Spam()
>>> assert(spam.egg is not spam.egg) # unique identities as spam.egg
                                     # returns a copy
>>> egg1 = spam.egg
>>> assert(egg1 is not spam.egg)
>>> egg2 = spam.egg
>>> assert(egg1 is not egg2)

相关问题 更多 >