import std.container: Array;
import std.algorithm: map;
import std.range: transposed;
import std.stdio: writeln;
Array!(Array!int) a;
a.insertBack(Array!int(1,2,3));
a.insertBack(Array!int(4,5,6));
writeln(a[].map!((ref a) => a[]).transposed);
错误:模板std.range.transposed无法推断出函数 参数类型!()(MapResult!(__ lambda1,RangeT!(Array!(Array!int)))))
我不太确定这里会发生什么,这不应该是一系列范围吗?为什么D
不能推断出类型?
如何将Array!(Array!T)
转换为范围范围?
答案 0 :(得分:2)
transposed
的模板约束是:
if (isForwardRange!RangeOfRanges &&
isInputRange!(ElementType!RangeOfRanges) &&
hasAssignableElements!RangeOfRanges)
我们可以使用pragma(msg)
来确定哪些约束失败:
auto m = a[].map!((ref a) => a[]);
pragma(msg, isForwardRange!(typeof(m)));
pragma(msg, isInputRange!(ElementType!(typeof(m))));
pragma(msg, hasAssignableElements!(typeof(m)));
对我来说,它会打印出来:
true
true
false
这意味着该范围没有可分配的元素。
这可能是因为Array
的{{1}}没有返回左值(在这种情况下opSlice
函数也可以返回左值),并且没有办法“取消将“map
切片映射到数组中,以支持通过a[]
分配到a
。
作为解决方法,您可以使用Map
切片:
Array