如何使用 boost::python 从流畅的界面公开属性?

发布于 2024-11-15 00:25:13 字数 896 浏览 1 评论 0原文

我有一个 C++ 类,它提供了一个流利接口,类似于:

class Foo
{
  public:
    int bar() const { return m_bar; };
    Foo& bar(int value) { m_bar = value; return *this; };

  private:
    int m_bar;
};

我想将 bar() 函数包装为我的 Python 类中的属性。所以我写道:

class_<Foo>("Foo")
  .add_property(
    "bar",
    (int (Foo::*)())&Foo::bar,
    (Foo& (Foo::*)(int))&Foo::bar
  )
;

但是编译器抱怨 setter,因为它返回一个 Foo& 而不仅仅是 void

我可能可以使用 make_function 来指定调用策略,但在这里我陷入困境:我不知道要指定哪个策略(我什至不知道这样的策略是否有效)政策已存在)。

我能做什么来解决这个问题?

这是编译器输出:

/usr/include/boost/python/detail/invoke.hpp:88: 错误:与调用 '(const boost::python::detail::specify_a_return_value_policy_to_wrap_functions_returning) ( Foo&)'

谢谢。

I have a C++ class which presents a fluent interface, something like:

class Foo
{
  public:
    int bar() const { return m_bar; };
    Foo& bar(int value) { m_bar = value; return *this; };

  private:
    int m_bar;
};

I'd like to wrap the bar() functions as a property in my Python class. So I wrote:

class_<Foo>("Foo")
  .add_property(
    "bar",
    (int (Foo::*)())&Foo::bar,
    (Foo& (Foo::*)(int))&Foo::bar
  )
;

But the compiler complains about the setter, because it returns a Foo& instead of just void.

I can probably use make_function to specify a call policy but here I'm stuck: I don't know which policy to specify (I don't even know if such a policy exists).

What can I do to solve this ?

Here is the compiler output:

/usr/include/boost/python/detail/invoke.hpp:88: error: no match for call to '(const boost::python::detail::specify_a_return_value_policy_to_wrap_functions_returning<Foo&>) (Foo&)'

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

许久 2024-11-22 00:25:13

我最终编写了以下模板函数:

template <class BaseClass, typename T, BaseClass& (BaseClass::*method)(T)>
void make_nonfluent_setter(BaseClass& self, T value)
{
    (self.*method)(value);
}

现在我可以输入:

class_<Foo>("Foo")
  .add_property(
    "bar",
    (int (Foo::*)())&Foo::bar,
    make_nonfluent_setter<Foo, int, &Foo::bar>
  )
;

它工作正常:)

I ended up writting the following template function:

template <class BaseClass, typename T, BaseClass& (BaseClass::*method)(T)>
void make_nonfluent_setter(BaseClass& self, T value)
{
    (self.*method)(value);
}

And now I can type:

class_<Foo>("Foo")
  .add_property(
    "bar",
    (int (Foo::*)())&Foo::bar,
    make_nonfluent_setter<Foo, int, &Foo::bar>
  )
;

And it works fine :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文