Boost logo

Boost :

Subject: Re: [boost] New, powerful way to use enable_if in C++0x
From: Jeffrey Lee Hellrung, Jr. (jeffrey.hellrung_at_[hidden])
Date: 2011-04-13 14:27:57


On Wed, Apr 13, 2011 at 11:02 AM, Matt Calabrese <rivorus_at_[hidden]> wrote:

> On Wed, Apr 13, 2011 at 1:35 PM, Jeffrey Lee Hellrung, Jr. <
> jeffrey.hellrung_at_[hidden]> wrote:
>
> > That would likely have issues with commas in the conditional, which I
> don't
> > think "double parens" could fix. That is, it's a problem unless all
> C++0x
> > compilers which support this use of SFINAE also support variadic
> > templates...
>
>
> I assume you mean variadic macros not variadic templates?

Yes, my mistake!

> Double parentheses
> would work fine when the compiler doesn't support variadic macros. Just
> define the macro as such, or similar:
>
> #define BOOST_ENABLE_IF( condition )\
> typename ::boost::enable_if\
> < typename ::boost::function_traits< void condition >::arg1_type\
> , int >::type = 0
>

Ah, clever, I hadn't seen or thought of that trick before.

Well that makes my comment null and void.

In fact it's possible to supply a simple variadic version when available and
> a regular macro similar to the one above when not, having the same macro
> name in either case without issue. You'd do this by making the variadic
> version check if the argument is parenthesized (which is possible with the
> preprocessor) and simply strip the parentheses if they are there. This
> allows backward compatibility by allowing people to specify either
> parenthesized or unparenthesized arguments.
>

Right.

Anyway, all of this parentheses hubbub is probably unecessary since as far
> as I know all compilers that have any experimental C++0x support already
> also support variadic macros (probably in part because of C99).
>

Yeah, I wasn't sure about this.

That covers any potential objections I had to the ENABLE_IF macro, and then
some! Thanks Matt.

- Jeff


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