Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Smart pointers and member function pointers (http://www.velocityreviews.com/forums/t450072-smart-pointers-and-member-function-pointers.html)

n2xssvv g02gfr12930 11-26-2005 10:05 AM

Smart pointers and member function pointers
 
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.

John Harrison 11-26-2005 12:52 PM

Re: Smart pointers and member function pointers
 
n2xssvv g02gfr12930 wrote:
> 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/wg...1996/N0831.pdf

I guess this proposal never got approved.

john

n2xssvv g02gfr12930 11-26-2005 10:55 PM

Re: Smart pointers and member function pointers
 
John Harrison wrote:
> n2xssvv g02gfr12930 wrote:
>
>> 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/wg...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)(); }
};

n2xssvv g02gfr12930 11-27-2005 10:51 AM

Re: Smart pointers and member function pointers
 
n2xssvv g02gfr12930 wrote:
> John Harrison wrote:
>
>> n2xssvv g02gfr12930 wrote:
>>
>>> 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/wg...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:

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


All times are GMT. The time now is 11:24 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.