$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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