argparse version 0.7.0 - a CLI parsing library

H. S. Teoh hsteoh at quickfur.ath.cx
Fri Mar 18 21:49:28 UTC 2022


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.


More information about the Digitalmars-d-announce mailing list