$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] Adding helpful requires macros to the enable_if utility
From: Mostafa (mostafa_working_away_at_[hidden])
Date: 2014-06-28 01:08:02
On Fri, 27 Jun 2014 09:35:14 -0700, Andrey Semashev
<andrey.semashev_at_[hidden]> wrote:
> On Friday 27 June 2014 09:10:33 paul Fultz wrote:
>> These following set of macros, I have found very useful in C++:
>>
>> #define
>> BOOST_ERROR_PARENTHESIS_MUST_BE_PLACED_AROUND_THE_RETURN_TYPE(...)
>> __VA_ARGS__>::type #define BOOST_FUNCTION_REQUIRES(...) typename
>> boost::enable_if_c<(__VA_ARGS__),
>> BOOST_ERROR_PARENTHESIS_MUST_BE_PLACED_AROUND_THE_RETURN_TYPE
>>
>> #define BOOST_CLASS_REQUIRES(...) typename
>> boost::enable_if_c<(__VA_ARGS__)>::type
>>
>> #define BOOST_REQUIRES(...) typename boost::enable_if_c<(__VA_ARGS__),
>> int>::type = 0
>>
>> Which I use like the following
>>
>> For functions:
>>
>> template <class T>
>> BOOST_FUNCTION_REQUIRES(boost::is_arithmetic<T>::value)
>> (T) foo(T t) { return t; }
>>
>> And C++11 functions:
>>
>> template <class T, BOOST_REQUIRES(boost::is_arithmetic<T>())>
>> T foo(T t) { return t; }
>>
>> Class specializations:
>>
>> template <class T, class Enable = void>
>> class A { ... };
>>
>> template <class T>
>> class A<T, BOOST_CLASS_REQUIRES(is_integral<T>())> { ... };
>>
>> template <class T>
>> class A<T, BOOST_CLASS_REQUIRES(is_float<T>())> { ... };
>>
>>
>> It would be nice if these were the added with the enable_if utility with
>> boost.
>
> Frankly, I'd prefer using enable_if directly instead of macros.
-1.
I find the use of macros to be far more readable than the direct use of
templates. In fact, I was earlier toying with the idea of writing such
macros myself. Needless to say that I would find them to be very helpful.
Paul, can the concept be extended to a DSEL-like utility? Something along
the lines of:
template <class T>
BOOST_FUNCTION_REQUIRES(is_foo(T) and is_bar(T))
(T) foo(T t) { return t; }
where "is_foo", "and", and "is_bar" are PPMP keywords. "Non-standard"
conditions can be introduced via the "explicit" keyword, like:
template <class T>
BOOST_FUNCTION_REQUIRES(is_foo(T) and is_bar(T) or
explicit(is_baz<T>::value))
(T) foo(T t) { return t; }
, or clients can be given a mechanism to hook in their own keywords. (I
have a mental sketch of how the latter could work, nothing implemented or
tested.)
Just thinking out loud ...