C++ Logo

sg10

Advanced search

Re: [SG10] New is_aggregate trait

From: Agustín Bergé <agustinberge_at_[hidden]>
Date: Fri, 7 Apr 2017 19:00:02 -0300
On 4/7/2017 5:19 PM, Richard Smith wrote:
> On 30 March 2017 at 19:14, Agustín Bergé <agustinberge_at_[hidden]
> <mailto:agustinberge_at_[hidden]>> wrote:
>
> LWG2911 gave us the new `is_aggregate` trait, but no feature-test macro.
> I would like to suggest `__cpp_lib_is_aggregate`. What follows is a
> motivational use case, courtesy of Jonathan Wakely:
>
> #include <vector>
> template<typename T, typename... Args>
> T make(Args&&... args)
> {
> #if __cpp_lib_is_aggregate
> if constexpr (std::is_aggregate_v<T>)
> return { std::forward<Args>(args)... };
> else
> #endif
> return T(std::forward<Args>(args)...);
> }
> struct Agg { int i; };
> int main()
> {
> auto v = make<std::vector<int>>(1, 2);
> #if __cpp_lib_is_aggregate
> // make<> only supports aggregates if std::is_aggregate is
> available
> auto a = make<Agg>(1);
>
>
> What does the #else look like here? I'm not yet seeing how this feature
> test macro is useful.
>
> #endif
> }

There is no #else form here, the example is depicting a program with
decreased functionality. A user of `make` that depends on the feature
simply uses it, and it results in a compilation error when the feature
is not present:

     int main()
     {
         auto a = make<Agg>(1);
     }

Whereas a user of `make` that does not depend on the feature simply does
not use it, and lack of support for the feature does not result in a
compilation error:

     int main()
     {
         auto v = make<std::vector<int>>(1, 2);
     }

The feature test macro is needed for the implementation of `make`, in
order to support both use cases.

Regards,
-- 
Agustín K-ballo Bergé
http://talesofcpp.fusionfenix.com

Received on 2017-04-08 00:00:19