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

Michael Rybakov opilar at ya.ru
Fri Jul 18 14:41:55 CEST 2014


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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20140718/fcb947b9/attachment-0001.html>


More information about the Cplusplus-sig mailing list