https://issues.dlang.org/show_bug.cgi?id=13981
--- Comment #1 from [email protected] --- As metaprogramming in D is so much fun (esp. when coming from C++), I've hacked together some experimental code. Remember that I'm a D newcomer, so please be gentle :-) // dmd 2.066.1 import std.algorithm, std.traits; private auto _rangeForStaticArray(R)(const ref R r) if (isStaticArray!R) { // pseudo code - no idea if it is possible to express hasHeapStorage!R or hasStackStorage!R // - could also test for immutable, but no sure if that's the correct semantics ? // - could also test for something like isGC!R ??? static if (1 || hasHeapStorage!R) { return r[]; // safe } else static if (hasStackStorage!R) { static assert(false, "stack storage for static array not allowed - pass a slice"); return r[]; // possibly unsafe ??? } else { static assert(false, "unknown storage for static array - pass a slice"); } } auto sum(R)(const ref R r) if (isStaticArray!R) { return std.algorithm.sum(_rangeForStaticArray(r)); } auto sum(R)(R r) if (!isStaticArray!R) { return std.algorithm.sum(r); } void test_dynamic_array() { int[] arr1 = [1, 2, 3, 4, 5]; immutable int[] arr2 = [1, 2, 3, 4, 5]; sum(arr1); // OK sum(arr2); // OK } void test_static_array() { int[5] arr1 = [1, 2, 3, 4, 5]; immutable int[5] arr2 = [1, 2, 3, 4, 5]; sum(arr1); // seems OK sum(arr2); // seems OK } --
