I am trying to use c++11 lambdas as accessor functions in boost::python
's add_property
, something along the following (the lambda is not strictly needed in this example, but will be needed for more complicated things happening inside the lambda, such as validation):
#include<boost/python.hpp>
struct A{
A(): a(2){};
int a;
};
BOOST_PYTHON_MODULE(boost_python_lambda)
{
boost::python::class_<A>("A")
// .def_readonly("a",&A::a) // the classical way: works fine
.add_property("a",[](const A& a){return a.a;})
;
}
However, compiling with clang++ (ver. 3.2) and -std=c++11
(the result is the same with g++ 4.7), I get this error:
/usr/include/boost/python/class.hpp:442:66: error: no matching function for call to 'get_signature'
return python::make_function(f, default_call_policies(), detail::get_signature(f, (T*)0));
^~~~~~~~~~~~~~~~~~~~~
/usr/include/boost/python/class.hpp:422:22: note: in instantiation of function template specialization 'boost::python::class_<A,
boost::python::detail::not_specified, boost::python::detail::not_specified,
boost::python::detail::not_specified>::make_fn_impl<A, <lambda at boost_python_lambda.cpp:12:21> >' requested here
return this->make_fn_impl(
^
/usr/include/boost/python/class.hpp:309:40: note: in instantiation of function template specialization 'boost::python::class_<A,
boost::python::detail::not_specified, boost::python::detail::not_specified,
boost::python::detail::not_specified>::make_getter<<lambda at boost_python_lambda.cpp:12:21> >' requested here
base::add_property(name, this->make_getter(fget), docstr);
^
boost_python_lambda.cpp:12:4: note: in instantiation of function template specialization 'boost::python::class_<A,
boost::python::detail::not_specified, boost::python::detail::not_specified,
boost::python::detail::not_specified>::add_property<<lambda at boost_python_lambda.cpp:12:21> >' requested here
.add_property("a",[](const A& a){return a.a;})
^
I tried wrapping the lambda in std::function<int(const A&)>(...)
, but that did not help with the argument deduction. Any idea?