Tom: > What should I do? Is there some way to get the original array type?
This code shows two ways to solve your problem: import std.stdio: writeln; import std.algorithm: map; import std.conv: to; import std.traits: ForeachType; import std.array: array; void foo(Range)(Range srange) if (is(ForeachType!Range == string)) { writeln(srange); } void bar(string[] sarray) { writeln(sarray); } void main() { int[] arr = [1, 2, 3]; auto srange = map!(to!string)(arr); foo(srange); string[] sarr = array(srange); bar(sarr); } They are good for different purposes, but in many cases the foo() version is good. If you want to simplify your code a little you may define a helper template like this: template IsIterableType(Range, T) { enum bool IsIterableType = is(ForeachType!Range == T); } void foo2(Range)(Range srange) if (IsIterableType!(Range, string)) { writeln(srange); } Bye, bearophile