is hash iteration cast required
Dan
dbdavidson at yahoo.com
Thu Nov 15 04:35:01 PST 2012
And if so is it safe. Without the postblit on X there is no
issue. With the postblit I get that X.__postblit is not callable,
indicating that somehow values are being copied even though my
hope was they would not since it is ref val. Unfortunately const
ref val is not accepted by the compiler. Assuming I do nothing to
val in the loop (in fact I'd like to just cast it to const to
guarantee it), is this the way to go?
Thanks
Dan
---------------------
import std.traits;
alias const(X)[string] Map;
struct X {
this(this) {}
char[] x;
}
void foo(ref const(Map) m) {
// FAILS TO COMPILE foreach(key, ref val; m) {
foreach(key, ref val; cast(DeepUnqual!(typeof(m)))m) {
pragma(msg, typeof(key));
}
}
void main() {
Map map;
foo(map);
}
template DeepUnqual(T) {
static if(isAssociativeArray!T) {
alias Unqual!(Unqual!(ValueType!T)[Unqual!(KeyType!T)])
DeepUnqual;
} else static if(isDynamicArray!T) {
alias Unqual!(Unqual!(ArrayElementType!T)[]) DeepUnqual;
} else static if(isPointer!T) {
alias Unqual!(PointerTarget!T) * DeepUnqual;
} else {
alias Unqual!T DeepUnqual;
}
}
More information about the Digitalmars-d-learn
mailing list