defaults.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 174 行
CPP
174 行
// Copyright David Abrahams 2002.// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)#include <boost/python/def.hpp>#include <boost/python/module.hpp>#include <boost/python/class.hpp>#include <boost/python/tuple.hpp>#include <boost/python/list.hpp>#include <boost/python/overloads.hpp>#include <boost/python/return_internal_reference.hpp>#if defined(_AIX) && defined(__EDG_VERSION__) && __EDG_VERSION__ < 245# include <iostream> // works around a KCC intermediate code generation bug#endifusing namespace boost::python;namespace bpl = boost::python;char const* const format = "int(%s); char(%s); string(%s); double(%s); ";/////////////////////////////////////////////////////////////////////////////////// Overloaded functions/////////////////////////////////////////////////////////////////////////////////objectbar(int a, char b, std::string c, double d){ return format % bpl::make_tuple(a, b, c, d);}objectbar(int a, char b, std::string c){ return format % bpl::make_tuple(a, b, c, 0.0);}objectbar(int a, char b){ return format % bpl::make_tuple(a, b, "default", 0.0);}objectbar(int a){ return format % bpl::make_tuple(a, 'D', "default", 0.0);}BOOST_PYTHON_FUNCTION_OVERLOADS(bar_stubs, bar, 1, 4)/////////////////////////////////////////////////////////////////////////////////// Functions with default arguments/////////////////////////////////////////////////////////////////////////////////objectfoo(int a, char b = 'D', std::string c = "default", double d = 0.0){ return format % bpl::make_tuple(a, b, c, d);}BOOST_PYTHON_FUNCTION_OVERLOADS(foo_stubs, foo, 1, 4)/////////////////////////////////////////////////////////////////////////////////// Overloaded member functions with default arguments/////////////////////////////////////////////////////////////////////////////////struct Y { Y() {} object get_state() const { return format % bpl::make_tuple(a, b, c, d); } int a; char b; std::string c; double d;};struct X { X() {} X(int a, char b = 'D', std::string c = "constructor", double d = 0.0) : state(format % bpl::make_tuple(a, b, c, d)) {} X(std::string s, bool b) : state("Got exactly two arguments from constructor: string(%s); bool(%s); " % bpl::make_tuple(s, b*1)) {} object bar(int a, char b = 'D', std::string c = "default", double d = 0.0) const { return format % bpl::make_tuple(a, b, c, d); } Y const& bar2(int a = 0, char b = 'D', std::string c = "default", double d = 0.0) { // tests zero arg member function and return_internal_reference policy y.a = a; y.b = b; y.c = c; y.d = d; return y; } object foo(int a, bool b=false) const { return "int(%s); bool(%s); " % bpl::make_tuple(a, b*1); } object foo(std::string a, bool b=false) const { return "string(%s); bool(%s); " % bpl::make_tuple(a, b*1); } object foo(list a, list b, bool c=false) const { return "list(%s); list(%s); bool(%s); " % bpl::make_tuple(a, b, c*1); } object get_state() const { return state; } Y y; object state;};BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_bar_stubs, bar, 1, 4)BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_bar_stubs2, bar2, 0, 4)BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_foo_2_stubs, foo, 1, 2)BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_foo_3_stubs, foo, 2, 3)///////////////////////////////////////////////////////////////////////////////BOOST_PYTHON_MODULE(defaults_ext){ def("foo", foo, foo_stubs()); def("bar", (object(*)(int, char, std::string, double))0, bar_stubs()); class_<Y>("Y", init<>("doc of Y init")) // this should work .def("get_state", &Y::get_state) ; class_<X>("X",no_init) .def(init<optional<int, char, std::string, double> >("doc of init", args("self", "a", "b", "c", "d"))) .def(init<std::string, bool>(args("self", "s", "b"))[default_call_policies()]) // what's a good policy here? .def("get_state", &X::get_state) .def("bar", &X::bar, X_bar_stubs()) .def("bar2", &X::bar2, X_bar_stubs2("doc of X::bar2")[return_internal_reference<>()]) .def("foo", (object(X::*)(std::string, bool) const)0, X_foo_2_stubs()) .def("foo", (object(X::*)(int, bool) const)0, X_foo_2_stubs()) .def("foo", (object(X::*)(list, list, bool) const)0, X_foo_3_stubs()) ;}#include "module_tail.cpp"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?