Subject: Re: [boost] Is there BOOST_ENABLE_IF macro now?
From: paul Fultz (pfultz2_at_[hidden])
Date: 2013-08-18 16:16:33


> From: TONGARI J >Hi folks, > >It's over 2 years since this post: >http://boost.2283326.n4.nabble.com/New-powerful-way-to-use-enable-if-in-C-0x-td3442723.html > >The macro looks sweet and I wonder if we have this macro in Boost in case >that I missed it. > This is nice for C++11 and conversion operators, I was not aware of this trick. However, it would be nice if boost provided requires macros to make it easier to specify traits for enable_if. See here for an implementation:     https://github.com/pfultz2/Zen/blob/master/zen/requires.h So functions can be defined like this:     template<class T, class U>     ZEN_FUNCTION_REQUIRES(is_arithmetic<T>, is_arithmetic<U>)     (T) max(T x, U y)     {         return x > y : x ? y;     } All the traits our inclusive by default, but the `exclude` keyword can be used to exclude the trait, like this:     template<class T, class U>     ZEN_FUNCTION_REQUIRES     (         is_arithmetic<T>,         is_arithmetic<U>,         exclude is_same<T, bool>,         exclude is_same<U, bool>     )     (T) max(T x, U y)     {         return x > y : x ? y;     } It can be used in classes like this:     template<class T, ZEN_REQUIRES(is_integral<T>)>     class A { ... }; Or this:     template <class T, class Enable = void>     class A { ... };     template <class T>     class A<T, ZEN_CLASS_REQUIRES(is_integral<T>)> { ... };     template <class T>     class A<T, ZEN_CLASS_REQUIRES(is_float<T>)> { ... }; This will all work on C++03 compilers as well. It could also be extended fairly easily to support the trick from Matt Calabrese. Plus, the `FUNCTION_REQUIRES` seems like it could be easily converted to use the `requires` and concept overloading when it gets added to the language as well. What do you think? Thanks, Paul Fultz II