>> 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
<schveiguy@yahoo.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