假设存在一些具有两个重载方法的类Foo:
class Foo
{
...
void m1(A& a);
void m1(B& b);
Run Code Online (Sandbox Code Playgroud)
我需要在boost-python上公开这些方法之一:
boost::python::class_<Foo>("Foo")
.def("m1", &Foo::m1)
Run Code Online (Sandbox Code Playgroud)
我应该如何指定m1(A&a)应该使用的签名m1(B&b)
Luc*_*ton 26
void (Foo::*m1)(A&) = &Foo::m1;
boost::python::class_<Foo>("Foo")
.def("m1", m1)
Run Code Online (Sandbox Code Playgroud)
Wer*_*ner 25
只是为了完成,它们也可以在python端暴露它们:
void (Foo::*m1_a)(A&) = &Foo::m1;
void (Foo::*m1_b)(B&) = &Foo::m1;
boost::python::class_<Foo>("Foo")
.def("m1", m1_a)
.def("m1", m1_b)
Run Code Online (Sandbox Code Playgroud)
虽然其他答案是正确的,但没有必要使用临时变量或任何恶作剧static_cast.
该def函数原型是这样的:
template <class Fn>
class_& def(char const* name, Fn fn);
template <class Fn, class A1>
class_& def(char const* name, Fn fn, A1 const&);
template <class Fn, class A1, class A2>
class_& def(char const* name, Fn fn, A1 const&, A2 const&);
template <class Fn, class A1, class A2, class A3>
class_& def(char const* name, Fn fn, A1 const&, A2 const&, A3 const&);
Run Code Online (Sandbox Code Playgroud)
如您所见,第一个模板参数(Fn)是您要包装的函数指针的类型.通常,编译器会为您推导出所有模板参数.但是,如果存在歧义,则需要帮助编译器.如果函数指针由于重载函数而不明确,则必须明确提供正确的类型.在你的情况下:
boost::python::class_<Foo>("Foo")
.def<void (Foo::*)(A&)>("m1", &Foo::m1)
.def<void (Foo::*)(B&)>("m1", &Foo::m1)
;
Run Code Online (Sandbox Code Playgroud)
简单,不是吗?无需在外面投射或捕获.同样的事情对于在模块级别创建独立功能是有效的,即使用boost::python::def.
您可以使用static_cast指定要使用的签名.使用此方法,您无需创建命名函数指针,同时还可以在单行上下文中保持重载决策.
boost::python::class_<Foo>("Foo")
.def("m1", static_cast<void (Foo::*)(A&)>(&Foo::m1))
.def("m1", static_cast<void (Foo::*)(B&)>(&Foo::m1))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5474 次 |
| 最近记录: |