Smart pointers and member function pointers

  • Thread starter n2xssvv g02gfr12930
  • Start date
N

n2xssvv g02gfr12930

Does anybody know of a smart pointer that supports 'operator->*'.

As yet I've always had to use this type of expression ((*sp).*pFnc)()
where

sp .... Smart pointer to Obj
pFnc .. Member function pointer ( void (Obj::*TYPE)(void) )

but never with (sp->*pFnc)() which is possible for pointers.
 
J

John Harrison

n2xssvv said:
Does anybody know of a smart pointer that supports 'operator->*'.

As yet I've always had to use this type of expression ((*sp).*pFnc)()
where

sp .... Smart pointer to Obj
pFnc .. Member function pointer ( void (Obj::*TYPE)(void) )

but never with (sp->*pFnc)() which is possible for pointers.

This article might interest you.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1996/N0831.pdf

I guess this proposal never got approved.

john
 
N

n2xssvv g02gfr12930

John said:
This article might interest you.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1996/N0831.pdf

I guess this proposal never got approved.

john

The best I could come up with was to return an appropriate functor class
like the template classes below allowing (sp->*pFnc)() to work.

template <typename R,typename C,typename V1>
class pmf1Functor
{
private:
C *p;
R (C::*pf)(V1);
public:
pmf1Functor(_Test *_p, R (C::*_pf)(V1)) : p(_p),pf(_pf) {}
R operator () (V1 inp) { return (p->*pf)(inp); }
};

template <typename C,typename V1>
class pmf1Functor<void, C,V1>
{
private:
C *p;
void (C::*pf)(V1);
public:
pmf1Functor(_Test *_p, void (C::*_pf)(V1)) : p(_p),pf(_pf) {}
void operator () (V1 inp) { (p->*pf)(inp); }
};

template <typename R,typename C>
class pmfFunctor
{
private:
C *p;
R (C::*pf)(void);
public:
pmfFunctor(_Test *_p, R (C::*_pf)(void)) : p(_p),pf(_pf) {}
R operator () (void) { return (p->*pf)(); }
};

template <typename C>
class pmfFunctor<void, C>
{
private:
C *p;
void (C::*pf)(void);
public:
pmfFunctor(_Test *_p, void (C::*_pf)(void)) : p(_p),pf(_pf) {}
void operator () (void) { (p->*pf)(); }
};
 
N

n2xssvv g02gfr12930

n2xssvv said:
The best I could come up with was to return an appropriate functor class
like the template classes below allowing (sp->*pFnc)() to work.

template <typename R,typename C,typename V1>
class pmf1Functor
{
private:
C *p;
R (C::*pf)(V1);
public: replace _Test with C
pmf1Functor(_Test *_p, R (C::*_pf)(V1)) : p(_p),pf(_pf) {}
R operator () (V1 inp) { return (p->*pf)(inp); }
};

template <typename C,typename V1>
class pmf1Functor<void, C,V1>
{
private:
C *p;
void (C::*pf)(V1);
public: replace _Test with C
pmf1Functor(_Test *_p, void (C::*_pf)(V1)) : p(_p),pf(_pf) {}
void operator () (V1 inp) { (p->*pf)(inp); }
};

template <typename R,typename C>
class pmfFunctor
{
private:
C *p;
R (C::*pf)(void);
public: replace _Test with C
pmfFunctor(_Test *_p, R (C::*_pf)(void)) : p(_p),pf(_pf) {}
R operator () (void) { return (p->*pf)(); }
};

template <typename C>
class pmfFunctor<void, C>
{
private:
C *p;
void (C::*pf)(void);
public: replace _Test with C
pmfFunctor(_Test *_p, void (C::*_pf)(void)) : p(_p),pf(_pf) {}
void operator () (void) { (p->*pf)(); }
};

With the minor corrections shown sp->*pFnc; will now return a functor
which then calls member pointer function from (sp->*pf)();

JB
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top