Boost logo

Boost :

From: Rani Sharoni (rani_sharoni_at_[hidden])
Date: 2003-01-28 16:46:35


"Rani Sharoni" <rani_sharoni_at_[hidden]> wrote in message
news:b16dqm$sh9$1_at_main.gmane.org...
>
> "David Abrahams" <dave_at_[hidden]> wrote in message
> news:u3cndjmu6.fsf_at_boost-consulting.com...
> > "John Maddock" <jm_at_[hidden]> writes:
> > > Yes, a class is it's own superclass/subclass, but IMO not it's own
> > > base: so it is a bug in the implementation.
> >
> > I'd like to suggest changing the documentation to match the
> > implementation at this point. I know of a few places where I have
> > relied on the current semantics, and I'm sure that's the case for
> > others as well. I'm not set on this course, but I think it's worth
> > considering.
>
> Before changing the documentation please consider the following improved
> implemetation that overcomes ambiguity and access control issues of the
> current is_base_and_derived implemetation (I lately posted it to
c.l.c++.m)
> :
>
> template <typename B, typename D>
> struct is_base_and_derived
> {
> private:
> typedef char (&yes)[1];
> typedef char (&no) [2];
>
> template<typename T>
> static yes check(D const volatile &, T);
> static no check(B const volatile &, int);
>
> struct C
> {
> operator B const volatile &() const;
> operator D const volatile &();
> };
>
> static C getC();
> public:
> static const bool result =
> sizeof(check(getC(), 0)) == sizeof(yes);
> };
>
> Additional specializations needed (e.g. void and reference types)

I fogot to show little usability sample:

struct B {};
struct B1 : B {};
struct B2 : B {};
struct D : B1, private B2 {};

typedef char Test[is_base_and_derived<B, D>::result]; // improvement 1 -
multiple base
typedef char Test[is_base_and_derived<B1,D>::result];
typedef char Test[is_base_and_derived<B2,D>::result]; // improvement 2 -
private base
typedef char Test[!is_base_and_derived<int,D>::result];

Enjoy,
Rani


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