Traits of variadic templates

Jeff massung at gmail.com
Tue Feb 9 16:22:16 UTC 2021


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!


More information about the Digitalmars-d-learn mailing list