Boost logo

Boost :

From: David Abrahams (abrahams_at_[hidden])
Date: 2000-10-02 06:56:15


----- Original Message -----
From: "Mat Marcus" <mmarcus_at_[hidden]>

> Au contraire. I believe this is a key observation. Thanks! We hadn't
> solved ISREF yet. In our work we've been using an ISCONST
> metafunction that uses IsNonConstPointer for a discriminator. That is
> (roughly)
>
> char IsNonConstPointer(void*);
> int IsNonConstPointer(...);
>
> template <class T>
> struct ISCONST {
> enum {RET = (sizeof(IsNonConstPointer((T*)0)) == 1)}; // The pointer
trick
> };
>
> If we combine this with your idea we could try
>
> template <class T>
> struct ISREF {
> enum {RET = sizeof(IsNonConstPointer(&((Holder<T>*)0)->x) == 1)};
> };
>

:( :( :(

I don't think this will work. And VC6.3 bears me out:

char IsNonConstPointer(void*);
int IsNonConstPointer(...);

template <class T> struct Holder { T x; Holder(); };

template <class T>
struct ISCONST {
     enum {RET = (sizeof(IsNonConstPointer((T*)0)) == 1)}; // The pointer
trick
};

template <class T>
struct ISREF {
    enum {RET = sizeof(IsNonConstPointer(&((Holder<T>*)0)->x) == 1)};
};

char a[ISREF<int&>::RET];
char b[!ISREF<int>::RET]; // fail
char c[!ISREF<int*>::RET]; // fail
char d[!ISREF<int* const>::RET]; // fail
char e[ISREF<const int&>::RET];
char f[!ISREF<const int>::RET]; // fail
char g[!ISREF<const int*>::RET]; // fail
char h[!ISREF<const int* const>::RET]; // fail
char i[ISREF<const volatile int&>::RET];
char j[!ISREF<const volatile int>::RET]; // fail
char k[!ISREF<const volatile int*>::RET]; // fail
char l[!ISREF<const volatile int* const>::RET]; // fail

Basically, it looks like ISREF<T>::RET is always true.

> I can't wait to go to work to try this on my Windows compiler. (Did I
> just say that? :-| ). Too bad Metrowerks' sizeof operator doesn't
> work.

What's wrong with sizeof()? Anyway, MW has partial specialization so you
shouldn't need such hackery.

-Dave


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