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

Reply via email to