C++ Logo

sg10

Advanced search

[SG10] New is_aggregate trait

From: Agustín Bergé <agustinberge_at_[hidden]>
Date: Thu, 30 Mar 2017 23:14:06 -0300
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);
     #endif
     }

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

Received on 2017-03-31 04:14:23