Jonathan M Davis: > It's not terribly pretty, but apparently no one could come up with a > satistfactory way of doing it in the language itself given the syntax for > references. So, Rebindable!(T) is the solution.
A helper function can help: import std.stdio, std.typecons, std.traits; template isImmutable(T) { // I don't know if this works well in all cases const bool isImmutable = is(const(T) == T) || is(immutable(T) == T); } Rebindable!T rebindable(T)(T obj) if ((is(T == class) || is(T == interface) || isArray!T) && isImmutable!T) { return Rebindable!T(obj); } class Foo { int x, y; } void main() { auto a = rebindable(new immutable(Foo(1, 2))); assert(a.sizeof == 4); a = new immutable(Foo(3, 4)); } A template like isImmutable can be useful in Phobos... Bye, bearophile