Boost logo

Boost :

From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2002-11-09 23:45:04


Douglas Gregor wrote:
> On Saturday 09 November 2002 07:21 pm, Aleksey Gurtovoy wrote:
> [snip some code...]
> > template< typename T > yes_tag is_callable_helper(
> > sink< sizeof(&T::operator()) >*
> > );
> [snip more code...]
>
> Won't work if there are multiple overloads of operator() or
> if it is a function template, unfortunately :(

True.

> > But of course none of the compilers are particularly happy
> > about it. How about adding 'is_callable<>' to the type_traits
> > proposal and requesting a compiler support for it?
>
> We could, but I have a hunch that we wouldn't get it. The
> is_callable trait takes a lot of specification and only handles
> very specific cases. If we're going to ask for something like
> is_callable, we're better off asking for something that handles
> more cases (i.e., "is this expression valid?" or "can I
> instantiate this class template?").

That one is definitely needed. But I am not sure that these are mutually
exclusive wishes :). I mean, suppose we've got such facility, for instance
in form of '__is_well_formed' operator that can be used like this:

    template< typename T >
    struct has_key_type
        : mpl::bool_c<__is_well_formed(typename T::key_type)>
    {
    };

or

    template< typename T >
    struct is_default_constructible
        : mpl::bool_c<__is_well_formed(T())>
    {
    };

Would it be enough for you to implement the 'is_callable' trait with the
desired behavior?

Aleksey


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