Let's say I have...

void foo(T...)(T xs)
{
    foreach(x; xs)
    {
        if (typeid(x) == typeid(int))
            writeln("int: ", x);
        else
            writeln("str: ", x);
    }
}

From the body, it's obvious I really only want int or string to be passed in to foo. Ideally, this check would be done at compile-time.

Obviously, I could modify foo to something like:

void foo(Algebraic!(int, string)[] xs)

I could also put checks in the body at runtime. But, for the sake of this thread, let's not. ;-)

What would be ideal (IMO) would be something along the lines of:

void foo(T...)(T xs) if (isIntegral!T || isSomeString!T)

But, those don't work because T is a Tuple of the types. Is there some trait combination I can use to do this? Something like (obviously made up)...

all(TemplateArgsOf!T, t => isIntegral!t || isSomeString!t)

Thanks!

Reply via email to