Boost python getter/setter with the same name
Boost python getter/setter with the same name
我正在用boost-python包装C++类,我想知道是否有比我现在做的更好的方法。
问题是这些类具有具有相同名称的getter/setter,并且似乎没有一种无痛的方法可以用boost-python包装它。
这是问题的简化版本。给定此类:
#include <boost/python.hpp>
using namespace boost::python;
class Foo {
public:
double
x() const
{
return _x;
}
void
x(const double new_x)
{
_x = new_x;
}
private:
double _x;
};
我想做这样的事情:
BOOST_PYTHON_MODULE(foo)
{
class_<Foo>("Foo", init<>())
.add_property("x", &Foo::x, &Foo::x)
;
}
这是行不通的,因为 boost-python 无法确定要使用哪个版本的函数。
事实上,你甚至做不到
.def("x", &Foo::x)
出于同样的原因。
我在 boost.org 重新阅读了教程,关于重载的部分似乎非常有前途。不幸的是,这似乎不是我想要的。
在重载部分,它提到了一个BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS
宏,其工作原理如下:
如果Foo
中还有另一个成员函数采用默认参数:
void z(int i=42)
{
std::cout << i << "n";
}
然后,您可以使用该宏:
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(z_member_overloads, z, 0, 1)
然后在BOOST_PYTHON_MODULE
:
.def("z", &Foo::z, z_member_overloads())
z_member_overloads
允许您调用def
一次,它将向 python 公开 0 参数和 1 参数的方法。
我希望这对我的x()
和x(double val)
getter/setter有用,但它不起作用。
行为:
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(x_member_overloads, x, 0, 1)
...
.def("x", &Foo::x, x_member_overloads())
不编译:
error: no matching member function for call to 'def'
.def("x", &Foo::x, x_member_overloads())
~^~~
问题:那么,有没有另一个宏或其他东西可以使它工作?
为了完整起见,这就是我目前处理此类情况的方式:
.add_property(
"x",
make_function(
[](Foo& foo) {
return foo.x();
},
default_call_policies(),
boost::mpl::vector<double, Foo&>()
),
make_function(
[](Foo& foo, const double val) {
foo.x(val);
},
default_call_policies(),
boost::mpl::vector<void, Foo&, double>()
)
)
您可以通过强制转换为适当的重载(未经测试)来执行此操作:
class_<Foo>("Foo", init<>())
.add_property("x",
static_cast< double(Foo::*)() const >(&Foo::x), // getter
static_cast< void(Foo::*)(const double) >(&Foo::x)) // setter
;
相关文章:
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- Doees the 'this' 指针参与虚函数的多态行为
- 为什么 Same<T, U> 不包含 Same<U, T>?
- Trie*& 和 Trie** 的意思是 Same?
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- 您将如何连接"on the fly"文本+整数并将其传递给函数?
- 如何理解"Temporary objs are destroyed as the last step in evaluating the full-expression"?谁能用一些简单的例子来说明这
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- Configuring the MPEG4MediaSink
- C++ "Same Letter"代码无法正常工作
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- What is the std::chrono::time_point equivalent of std::numer
- 如何在数据库程序中添加"reduce the quantity of an item"功能?
- 为什么"an inherited constructor is not a candidate for initialization from an expression of the same or
- Boost python getter/setter with the same name
- 当 A 和 B "the same"时断言(sizeof(A) == sizeof(B))是否安全?
- 为什么我会看到"member function with the same name as its class must be a constructor"?
- "local variables at the outermost scope of the function may not use the same name as any parameter"是
- PCAP Destination and Source are the same