Boost logo

Boost :

From: Jonathan Turkanis (technews_at_[hidden])
Date: 2004-03-21 04:55:31


    Often I use enable_if and its cousins to add functionality to code
which works okay on compilers without SFINAE. So I have a lot of code
which looks like this:

    template<typename T>
    #ifndef BOOST_NO_SFINAE
        typename enable_if<is_xxx<T>, int>::type
    f(T t);


    template<typename T>
    void f( T t
            #ifndef BOOST_NO_SFINAE
                , typename enable_if<is_xxx<T>, int>::type* = 0

It would be nice to have macros BOOST_ENABLE_IF_RETURN(condition,
result) and BOOST_ENABLE_IF_PARAM(condition) so that the above could
be written

    template<typename T>
    BOOST_ENABLE_IF_RETURN(is_xxx<T>, void) f(T);

    template<typename T>
    void f(T BOOST_ENABLE_IF_PARAM(is_xxx<T>));

(And similarly for enable_if_c, etc.)

It's straightforward to write macros which work for conditions which
don't need to be enclosed in parentheses; e.g.:

    #ifndef BOOST_NO_SFINAE
    # define BOOST_ENABLE_IF_RETURN(condition, result) \
         typename boost::enable_if<condition, result>::type
    # define BOOST_ENABLE_IF_RETURN(condition, result) result

With a little more work, you can allow use such as

    template<typename T, typename U>
    BOOST_ENABLE_IF_RETURN((is_base_and_derived<T, U>), void)
    f(T, U);


    #define BOOST_ENABLE_IF_RETURN(condition, result) \
        typename boost::enable_if< \
                    typename boost::function_traits< \
                        void condition \
>::arg1_type, result \

Here the parentheses in the macro invocation are required. (I've found
I can make the parentheses in the macro invocation optional by
surrounding 'condition' in the above #define with parentheses --
'void(condition)' -- but I'm not sure this is standard conforming. It
does work on a lot of good compilers, though.)

Any thoughts?


Boost list run by bdawes at, gregod at, cpdaniel at, john at