Boost logo

Boost :

From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2002-03-22 10:00:12


Jason Shirk wrote:
> I don't think this would be conforming, defaults are not part of the
> function type, so the rules of 14.8.2/2 don't help.
>
> But if you used something like:
>
> template < typename T, void (T::*)() > struct ptmf_helper {};
>
> template< typename T >
> yes_tag has_member_foo_helper(int, ptmf_helper<T, &T::foo>* p = 0);
>
> Then I think this could work.

It works! (with Comeau C/C++ 4.2.45.2, and as far as I can see it's
well-formed):

    typedef char (&no_tag)[1];
    typedef char (&yes_tag)[2];

    template < typename T, void (T::*)() > struct ptmf_helper {};
    template< typename T > no_tag has_member_foo_helper(...);

    template< typename T >
    yes_tag has_member_foo_helper(ptmf_helper<T, &T::foo>* p);

    template< typename T >
    struct has_member_foo
    {
        BOOST_STATIC_CONSTANT(bool
            , value = sizeof(has_member_foo_helper<T>(0)) == sizeof(yes_tag)
            );
    };

    struct my {};
    struct her { void foo(); };

    BOOST_STATIC_ASSERT(!has_member_foo<my>::value);
    BOOST_STATIC_ASSERT(has_member_foo<her>::value);

Jason, you're a genius!

>
> Oddly enough, the rules in 14.8.2/2 don't mention this case as one of
> the possible failures. If the standard is going to the trouble of
> enumerating everything that will fail, then this case should certainly
> be included.
>
> Now if only VC7.1 could compile that...

I _really_ wish it could :).

Aleksey


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