Boost logo

Boost :

Subject: [boost] Class-level instrospection
From: Joel Falcou (joel.falcou_at_[hidden])
Date: 2008-10-09 05:08:42


Daniel Walker a écrit :
> Why don't we both package what we have, upload to vault, and then
> work out merging the two and adding the rest in another thread?

I've cleaned-up my files and 'boostified' them so to speak.
I've uploaded a 'introspection.zip' on the vault so you can grab it and
we can start discussing this in a proper topic ;)

Basically i've uploaded the following :

BOOST_HAVE_MEMBER_FUNCTION
BOOST_HAVE_CONST_MEMBER_FUNCTION
BOOST_HAVE_NON_CONST_MEMBER_FUNCTION
BOOST_HAVE_MEMBER_DATA

Basically, the usage is really simple.
You want to check if classes provides a bool is_ok(long) method and you
want to catch both const and non-const variations :

BOOST_HAVE_MEMBER_FUNCTION(is_ok, bool(long) )

then the check itself is done via :

has_member_function<T>::type

For BOOST_HAVE_DATA_MEMBER, my method can only check for public members.
So I added a macoer called BOOST_INSTROSPECTION_SUPPORT(C,V) that have
to be used in user-defined class C that want to publish a member named V
to our introspection mecanism.

struct foo
{
   private :
   int mValue;
};

struct bar
{
   BOOST_INTROSPECTION_SUPPORT(bar,mValue);

   private :
   int mValue;
};

BOOST_HAVE_MEMBER_DATA(int, mValue)

has_member_data_mValue<foo>::value is false
has_member_data_mValue<bar>::value is true

Other limitations is that currently you can't have various check for a
method with a given name but different signature. I'm working on a fix
using PP sequence and :

BOOST_HAS_MEMBER_FUNCTION_OVERLOADS(func,(void())(void(int))(void(int,int)))

In the same way, checking for suff like operator[] yields invalid class
name has_member_function_operator[]. So I propose we hand-code the
following :

BOOST_HAS_SUBSCRIPT_OPERATOR( void(int) ) that builds a
has_subscript_operator<T> class. Other similar operator should be
handled the same way.


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