[C++-sig] Exposing Friend Functions in C++ Python Boost

Kv Gopalkrishnan kvgopalkrishnan1 at gmail.com
Mon Jul 21 09:27:16 CEST 2014


Hi Michael
               Yes this works. Thank you for your answer and help :)

Kind Regards
KV


On Fri, Jul 18, 2014 at 3:41 PM, Michael Rybakov <opilar at ya.ru> wrote:

> When I said “outside” I meant standalone function.
> Moreover I see you’ve added property with the same functions. This won’t
> work. I would recommend you to look at docs -
> http://www.boost.org/doc/libs/1_55_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.constructors
>
> Valid wrap with untouched class declaration.
>
> class Turtle
> {
> friend const PV& GetHeading(const Turtle& t);
> friend const PV& GetLeft(const Turtle& t);
> friend const P& GetPoint(const Turtle& t);
> friend void SetPoint(Turtle& t, const P& p);
> public:
>
> ...
>
> private:
> PV h;
> PV l;
> };
>
>
> BOOST_PYTHON_MODULE(TurtleWrapper)
> {
> class_<Turtle>("Turtle")
> ;
>
> def("GetHeading",&Turtle::GetHeading)
> def("GetLeft",&Turtle::GetLeft)
> }
>
> Anyway I would recommend you not to use friend functions to get something
> from private section of class. If you’ll make methods your code will be
> cleaner. Working code:
>
> #include <boost/python.hpp>
>
> struct PV{};
> struct P{};
>
> class Turtle
> {
> public:
>     const PV& GetHeading()
>     {
>         return mHeading;
>     }
>
>     const PV& GetLeft()
>     {
>         return mLeft;
>     }
>
>     const  P& GetPoint()
>     {
>         return mPoint;
>     }
>
>     void SetPoint(const P& p)
>     {
>         mPoint = p;
>     }
>
> private:
>     PV mHeading, mLeft;
>     P mPoint;
> };
>
> using namespace boost::python;
>
> BOOST_PYTHON_MODULE(TurtleWrapper)
> {
>     class_<Turtle>("Turtle")
>         .add_property("Heading", make_function(&Turtle::GetHeading,
> return_internal_reference<>()))
>         .add_property("Left",    make_function(&Turtle::GetLeft,
> return_internal_reference<>()))
>         .add_property("Point",   make_function(&Turtle::GetPoint,
> return_internal_reference<>()), &Turtle::SetPoint)
>     ;
> }
>
> On 18 Jul 2014, at 15:37, Kv Gopalkrishnan <kvgopalkrishnan1 at gmail.com>
> wrote:
>
> Hi
>    Thanks Michael For the answer however I am a bit confused about the
> solution you gave. Do you mean to remove the GetHeading function and paste
> it outside  class Turtle ?
>
> Jim here is a concrete example.
>
>
> #include <iostream>
> #include <mathsym.h>
> #include <P.h>
> #include <PV.h>
>
> using namespace std;
> using namespace cxxadt;
>
>
> class Turtle{
>       friend const PV& GetHeading(const Turtle& t);
> public:
>
>   Turtle();
>   private:
>
> PV h;
>
> };
>
> now corresponding to this the wrapper i wrote for this
>
> #include <iostream>
>
> #include <boost/python.hpp>
>
> #include <boost/python/module.hpp>
>
> #include <boost/python/def.hpp>
>
> #include <boost/python/scope.hpp>
>
> #include <boost/python/class.hpp>
>
> #include"Turtle.h"
>
> #include <mathsym.h>
>
> #include <P.h>
>
> #include <PV.h>
>
>
> using namespace std;
>
> using namespace boost::python;
>
> using namespace cxxadt;
>
>
>
> BOOST_PYTHON_MODULE(TurtleWrapper)
>
> {
>
>
>     class_<Turtle>("Turtle")
>
>                .def("GetHeading",&GetHeading) ;
>
> }
>
>
>   class_<PV>("PV",init<const PV>());
>
>     class_<P>("P",init<const P>());
>
>
> }
>
>
>
>
>
> Kind Regards
>
> KV
>
>
>
>
>
>
>
>
>
>
>
>
>
> On Fri, Jul 18, 2014 at 1:50 PM, Jim Bosch <talljimbo at gmail.com> wrote:
>
>> On Jul 18, 2014 6:32 AM, "Kv Gopalkrishnan" <kvgopalkrishnan1 at gmail.com>
>> wrote:
>> >
>> > Hi Jim
>> >           Thank you for the answer. When I tried this solution
>> > i.e.  .def("GetHeading",&GetHeading)
>> > error: ‘GetHeading’ was not declared in this scope
>> >
>> >
>> > I get the above error.
>> > Stating the obvious the error  says function was not described in the
>> scope. Seems a bit nasty business is it so that I would have to write a get
>> function in someway in to public domain to get the function wrapped in to
>> boost?
>> >
>>
>> I'm pretty sure that should have worked.  Could you post a more complete
>> example?  I suspect the problem is elsewhere.
>>
>> Jim
>>
>> >
>> > On Thu, Jul 17, 2014 at 3:12 PM, Jim Bosch <talljimbo at gmail.com> wrote:
>> >>
>> >> The problem here is actually a  C++ issue, not a Boost.Python one.
>>  Friend functions aren't considered to be part of the scope of the class
>> that they're friends with, so when referring to them, just use e.g.
>> "&GetHeading", not "&Turtle::GetHeading".
>> >>
>> >> Jim
>> >>
>> >>
>> >> On Wed, Jul 16, 2014 at 7:52 AM, Kv Gopalkrishnan <
>> kvgopalkrishnan1 at gmail.com> wrote:
>> >>>
>> >>> I want to expose a C++ friend functions to python using Python boost.
>> >>>   class Turtle{
>> >>>                    friend const PV& GetHeading(const Turtle& t);
>> >>>                    friend const PV& GetLeft(const Turtle& t);
>> >>>                    friend const P& GetPoint(const Turtle& t);
>> >>>                    friend void SetPoint(Turtle& t, const P& p);
>> >>>                    public:
>> >>>
>> >>>                    ...
>> >>>
>> >>>                    private:
>> >>>                    PV h;
>> >>>                    PV l;
>> >>>
>> >>>               };
>> >>>
>> >>>
>> >>> Here I have wrapped the classes PV and P so no problem there. I tried
>> to wrap the friend functions like regular functions. Like
>> >>>
>> >>>               BOOST_PYTHON_MODULE(TurtleWrapper)
>> >>>                   {
>> >>>                      class_<Turtle>("Turtle")
>> >>>                        .def("GetHeading",&Turtle::GetHeading)
>> >>>                        .def("GetLeft",&Turtle::GetLeft)
>> >>>                        .add_property("h",&Turtle::GetHeading)
>> >>>                        .add_property("l",&Turtle::GetLeft);
>> >>>                  }
>> >>> When i run the code i get error messages.
>> >>>
>> >>>                error: ‘GetHeading’ is not a member of ‘Turtle’
>> >>>                error: ‘GetLeft’ is not a member of ‘Turtle’
>> >>>
>> >>> This error is seen for add_property and also .def.
>> >>> So I assume that this is not the way to declare a friend function and
>> the documentation of python boost does not seem (or at least I did not see
>> a note about friend functions). Any help is much appreciated.
>> >>>
>> >>>
>> >>>
>> >>> Kind Regards
>> >>> K.V.
>> >>>
>> >>> _______________________________________________
>> >>> Cplusplus-sig mailing list
>> >>> Cplusplus-sig at python.org
>> >>> https://mail.python.org/mailman/listinfo/cplusplus-sig
>> >>
>> >>
>> >>
>> >> _______________________________________________
>> >> Cplusplus-sig mailing list
>> >> Cplusplus-sig at python.org
>> >> https://mail.python.org/mailman/listinfo/cplusplus-sig
>> >
>> >
>> >
>> >
>> > --
>> > K.V.
>> >
>> > _______________________________________________
>> > Cplusplus-sig mailing list
>> > Cplusplus-sig at python.org
>> > https://mail.python.org/mailman/listinfo/cplusplus-sig
>>
>> _______________________________________________
>> Cplusplus-sig mailing list
>> Cplusplus-sig at python.org
>> https://mail.python.org/mailman/listinfo/cplusplus-sig
>>
>
>
>
> --
> K.V.
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> https://mail.python.org/mailman/listinfo/cplusplus-sig
>
>
>
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> https://mail.python.org/mailman/listinfo/cplusplus-sig
>



-- 
K.V.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20140721/9d5acee3/attachment-0001.html>


More information about the Cplusplus-sig mailing list