On Fri, Mar 18, 2022 at 09:30:57PM +0000, Adam Ruppe via Digitalmars-d-announce 
wrote:
[...]
> One approach you might consider is a hybrid too, where you have the
> big struct you build out of the individual udas.
> 
> So you work on the big one but you do getBig!decl and it loops through
> the members of thebig struct and sees if the same-typed UDAs are on
> decl. If so, it loads them in, if not, it leaves default values.
[...]

Yeah, that's what I thought too. So you could have something like this:

        struct SmallUDA {}
        struct AnotherSmallUDA {}

        struct AggregateUDAs {
                bool hasSmall;
                bool hasAnotherSmall;

                static typeof(this) opCall(T)() {
                        AggregateUDAs result;
                        hasSmall = hasUDA!(T, SmallUDA);
                        hasAnotherSmall = hasUDA!(T, AnotherSmallUDA);
                        return result;
                }
        }

        void processUDAs(T)() {
                // Look ma! No need to sprinkle hasUDA everywhere
                enum aggreg = AggregateUDAs!T();
                ...
                static if (aggreg.hasSmall) { ... }
                ...
                static if (aggreg.hasAnotherSmall) { ... }
                ...
        }

        @SmallUDA
        @AnotherSmallUDA
        struct MyInputType { ... }

        processUDAs!MyInputType();


T

-- 
Why did the mathematician reinvent the square wheel?  Because he wanted to 
drive smoothly over an inverted catenary road.

Reply via email to