|
Boost : |
From: David Abrahams (dave_at_[hidden])
Date: 2002-11-19 08:08:33
Aleksey Gurtovoy <agurtovoy_at_[hidden]> writes:
> Peter Dimov wrote:
>> I wrote "I don't understand how it works even _after_ (briefly)
>> looking at the code. ;-)" but then it occured to me that list(int, char,
>> long, int) is a function type.
>
> Yep.
>
>> Cool trick. Cv qualifiers will probably be a problem
>
> They are stripped on non-class rvalues, aren't they? :(. So, basically, this
> one will work:
>
> typedef eval<
> count_if(
> list(int,char,long,her const)
> , lambda(is_same(_,her const))
> )
> >::type res;
>
> BOOST_STATIC_ASSERT(res::value == 1);
>
> but this one won't:
>
> typedef eval<
> count_if(
> list(int,char,long,int const)
> , lambda(is_same(_,int const))
> )
> >::type res;
>
> BOOST_STATIC_ASSERT(res::value == 1); // error, res::value == 2
Actually I think they're stripped in function argument lists
for classes as well.
struct X {};
void f(X const) {}
void (&g)(X) = f; // proof
// really prove it's not just a conversion
template <class T, class U> struct same;
template <class T> struct same<T,T> {};
template <class T, class U>
int cksame(T&,U&)
{
same<T,U> z;
return 0;
}
int z = cksame(f,g);
> P.S. It just occured to me that with the above we finally have a way
> to write two nested template instantiations without a space between
> their closing brackets:
>
> typedef one<another<int> > == typedef eval< one(another(int)) >::type
Sort of. They're not templates anymore are they?
> That one would really make a good
...or EVIL!...
> obfuscated contest's task :).
This is too funny.
-- David Abrahams dave_at_[hidden] * http://www.boost-consulting.com Boost support, enhancements, training, and commercial distribution
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk