On Tue, Aug 17, 2021 at 07:22:54PM +0000, james.p.leblanc via Digitalmars-d-learn wrote: [...] > auto moo(T : (int || float || mySpecialStruct )(T myMoo) {•••} > > When re-using any such sets, it would be nice to define the set as > follows: > > S = (int || float || mySpecialStruct) > > and then define "moo" more concisely as: > > auto moo(T < S)(T myMoo) {•••} > > ( where I have used "<" to mean "T is a member of S"). [...]
You could use a helper template and an AliasSeq for this: template isAmong(T, S...) { static if (S.length == 0) enum isAmong = false; else enum isAmong = is(T == S) || isAmong(T, S[1..$]); } import std.meta : AliasSeq; alias MyTypes = AliasSeq!(int, float, MySpecialStruct); auto myFunc(T)(T a, T b) if (isAmong!(T, MyTypes)) { ... } T -- I am a consultant. My job is to make your job redundant. -- Mr Tom