>> You can insert a cast to Object first. doesn't seem to work. I'm trying to write a generic solution but having an innocent 'T opCast(T : int)() { return 1; }' breaks it, see Error below. doesn't seem to work.
This seems to call for a compiler solution? import std.stdio; import std.conv; void*AddressOf(T)(T a) if(is(T==class)){ return cast(void*)cast(Object) a;//Error: template instance opCast!( Object) opCast!(Object) does not match template declaration opCast(T : int)( ) } T*AddressOf(T)(ref T a) if(!is(T==class)){ return &a; } class A{ int x; T opCast(T : int)() { return 1; } // int opCast(T:void*)() { return 1; } //won't work either } struct B{ } void main(){ A a; writeln(AddressOf(a)); a = new A; writeln(AddressOf(a)); B b; writeln(AddressOf(b)); B*b2; writeln(AddressOf(*b2)); // writeln(AddressOf(B.init)); //waiting for rvalue ref, DIP39 } On Wed, May 15, 2013 at 11:30 AM, Steven Schveighoffer <schvei...@yahoo.com>wrote: > On Wed, 15 May 2013 11:08:33 -0400, Artur Skawina <art.08...@gmail.com> > wrote: > > On 05/15/13 13:04, Dicebot wrote: >> >>> On Wednesday, 15 May 2013 at 10:31:29 UTC, David wrote: >>> >>>> "&c" is address of reference, no class instance. I don't know if there >>>>> is a way to get a pointer to class instance in D but I am not aware of >>>>> one. >>>>> >>>> >>>> A simple cast to void* should do it: cast(void*)c >>>> >>> >> class C { auto opCast(T:void*)() { return null; } } >> >> So - no - a simple cast to void* won't always work, as the op can be >> overloaded, even if only by accident. >> > > You can insert a cast to Object first. > > -Steve >