Pass range to a function

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jul 27 14:47:14 PDT 2017


On 07/27/2017 02:16 PM, Chris wrote:

 > What is the value of `???` in the following program:

 > void categorize(??? toks) {
 >   foreach (t; toks) {
 >     writeln(t);
 >   }
 > }

The easiest solution is to make it a template (R is a suitable template 
variable name for a range type):

void categorize(R)(R toks) {
   foreach (t; toks) {
     writeln(t);
   }
}

Your function will work with any type that can be iterated with foreach 
and can be passed to writeln. However, you can use template constraints 
to limit its usage, document its usage, or produce better compilation 
errors when it's called with an incompatible type (the error message 
would point at the call site as opposed to the body of categorize):

import std.range;
import std.traits;

void categorize(R)(R toks)
if (isInputRange!R && isSomeString!(ElementType!R)) {
   foreach (t; toks) {
     writeln(t);
   }
}

Ali



More information about the Digitalmars-d-learn mailing list