Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2004-05-09 10:37:46


Hi,

The enclosed post showed up on c.l.c++.m; AFAICT it has little or
nothing to do with MPL, but it does contain several boost-related
issues. The best answer isn't really clear to me; we could detect
dereferenceability, use a hack involving get_pointer, or maybe
something else would be appropriate. Would anyone like to tackle
this one?


attached mail follows:


All,

I'm a beginner here, and am trying to do a relatively simple task (as
far as MPL is concerned). I finally solved a simple case, but I don't
think it's the proper solution in general.

Basically, I'm going to write a template class to operate on a class
T. It expects T to conform to a interface. In my simple case - it
only requires a method 'hi()'.

Now, what I'd really like is for my template class to be able to
operate on T regardless of whether or not it's a pointer, a reference,
a const reference, etc.

And I don't want to have to write code (that obviously doesn't work) like:

    if (boost::is_pointer<T>::value) {
      t->hi();
    }
    else {
      t.hi();
    }

I've attached a simple example that works (well, haven't checked const
yet), but would appreciate feedback - or a pointer to an
implementation that already does the trick. Compiles and runs in gcc3.2.

And secondly, what traits does a class have to have to be considered a
pointer? i.e. that satisfies

    BOOST_STATIC_ASSERT(boost::is_pointer<T>::value);

Just thinking about working with auto_ptr, boost::smart_ptr,
user-defined-pointer-type etc.

many thanks,

BFW

---------------------------------------------------------
struct SayHi
{
   void hi()
   {
     cout << "Saying hi" << endl;
   }

};

template <class T>
struct Blah {
   typedef typename boost::remove_pointer<T>::type T_type;
   typedef typename boost::add_reference<T_type>::type T_reference;
   typedef typename boost::add_pointer<T_type>::type T_pointer;

   T_reference remove_pointer(T_reference t)
   {
     return t;
   }

   T_reference remove_pointer(T_pointer t)
   {
     return *t;
   }

   Blah(T t) {
     remove_pointer(t).hi();
   }
};

// these work, yay.
SayHi hi;
Blah<SayHi> b(hi);
Blah<SayHi*> bptr(&hi);
Blah<SayHi&> bref(hi);

      [ See http://www.gotw.ca/resources/clcm.htm for info about ]
      [ comp.lang.c++.moderated. First time posters: Do this! ]


-- 
Dave Abrahams
Boost Consulting
http://www.boost-consulting.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk