@@ -157,12 +157,24 @@ constexpr descr<1, Type> _() {
157157#endif // #ifndef _
158158
159159constexpr descr<0 > concat () { return {}; }
160+ constexpr descr<0 > union_concat () { return {}; }
160161
161162template <size_t N, typename ... Ts>
162163constexpr descr<N, Ts...> concat (const descr<N, Ts...> &descr) {
163164 return descr;
164165}
165166
167+ template <size_t N, typename ... Ts>
168+ constexpr descr<N, Ts...> union_concat (const descr<N, Ts...> &descr) {
169+ return descr;
170+ }
171+
172+ template <size_t N1, size_t N2, typename ... Ts1, typename ... Ts2>
173+ constexpr descr<N1 + N2 + 3 , Ts1..., Ts2...> operator |(const descr<N1, Ts1...> &a,
174+ const descr<N2, Ts2...> &b) {
175+ return a + const_name (" | " ) + b;
176+ }
177+
166178#ifdef __cpp_fold_expressions
167179template <size_t N1, size_t N2, typename ... Ts1, typename ... Ts2>
168180constexpr descr<N1 + N2 + 2 , Ts1..., Ts2...> operator ,(const descr<N1, Ts1...> &a,
@@ -174,12 +186,25 @@ template <size_t N, typename... Ts, typename... Args>
174186constexpr auto concat (const descr<N, Ts...> &d, const Args &...args) {
175187 return (d, ..., args);
176188}
189+
190+ template <size_t N, typename ... Ts, typename ... Args>
191+ constexpr auto union_concat (const descr<N, Ts...> &d, const Args &...args) {
192+ return (d | ... | args);
193+ }
194+
177195#else
178196template <size_t N, typename ... Ts, typename ... Args>
179197constexpr auto concat (const descr<N, Ts...> &d, const Args &...args)
180198 -> decltype(std::declval<descr<N + 2 , Ts...>>() + concat(args...)) {
181199 return d + const_name (" , " ) + concat (args...);
182200}
201+
202+ template <size_t N, typename ... Ts, typename ... Args>
203+ constexpr auto union_concat (const descr<N, Ts...> &d, const Args &...args)
204+ -> decltype(std::declval<descr<N + 3 , Ts...>>() + union_concat(args...)) {
205+ return d + const_name (" | " ) + union_concat (args...);
206+ }
207+
183208#endif
184209
185210template <size_t N, typename ... Ts>
0 commit comments