| Thread overview | |||||||
|---|---|---|---|---|---|---|---|
|
April 04, 2007 shouldn't cast(Object)cast(void*)anything work? | ||||
|---|---|---|---|---|
| ||||
for something with the same size as a pointer like , int, int*, i hope it can be
directly cast to cast(void*), coz nowadays d has a particularly strict cast system
and the casting something not Object to any Class now seems impossible at all without
union trick(even u can't cast void* to it) . This is really uncomfortable. coz extra
runtime var would be required
consider :
class Expression{}
Expression EXP_CANT_INTERPRET = cast(Expression)cast(void*)1; // this won't compile
you need to:
union __exp
{
Expression _m_exp;
int i;
}
__exp EXP_CANT_INTERPRET;
static this()
{
EXP_CANT_INTERPRET.i=1;
}
and i don't get why i can't use the following work:
//in order to get rid of the runtime extra var
union _EXP_CANT_INTERPRET // coz we can't use an union as an instance
{
Expresssion _m_exp;
int i=1;
}
_EXP_CANT_INTERPRET EXP_CANT_INTERPRET; //compiler complains overlap initializer?? strange
and this won't work either:
struct _EXP_CANT_INTERPRET
{
union
{
Expression _m_exp;
int i=1; //this would either complain overlap initializer of struct _EXP_CANT_INTERPRET
}
}
_EXP_CANT_INTERPRET EXP_CANT_INTERPRET
any effort of bringing EXP_CANT_INTERPRET to compile time would be impossible,
that's quite painful IMO. Did i miss some better solutions?
| ||||
April 04, 2007 Re: shouldn't cast(Object)cast(void*)anything work? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Davidl | Davidl wrote:
> for something with the same size as a pointer like , int, int*, i hope it
> can be
> directly cast to cast(void*), coz nowadays d has a particularly strict
> cast system
> and the casting something not Object to any Class now seems impossible at
> all without
> union trick(even u can't cast void* to it) . This is really uncomfortable.
> coz extra
> runtime var would be required
>
> consider :
> class Expression{}
> Expression EXP_CANT_INTERPRET = cast(Expression)cast(void*)1; // this
> won't compile
>
> you need to:
>
> union __exp
> {
> Expression _m_exp;
> int i;
> }
>
> __exp EXP_CANT_INTERPRET;
>
> static this()
> {
> EXP_CANT_INTERPRET.i=1;
> }
>
> and i don't get why i can't use the following work:
>
> //in order to get rid of the runtime extra var
>
> union _EXP_CANT_INTERPRET // coz we can't use an union as an instance
> {
> Expresssion _m_exp;
> int i=1;
> }
> _EXP_CANT_INTERPRET EXP_CANT_INTERPRET; //compiler complains overlap
> initializer?? strange
>
> and this won't work either:
>
> struct _EXP_CANT_INTERPRET
> {
> union
> {
> Expression _m_exp;
> int i=1; //this would either complain overlap initializer of
> struct _EXP_CANT_INTERPRET
> }
> }
> _EXP_CANT_INTERPRET EXP_CANT_INTERPRET
>
> any effort of bringing EXP_CANT_INTERPRET to compile time would be
> impossible,
> that's quite painful IMO. Did i miss some better solutions?
This works for me using gdc 0.23
void main()
{
Object t=new Object;
int* i=cast(int*)t;
int d;
t=cast(Object)d;
t=cast(Object)i;
printf("%*s\n",t.toString());
}
prints
object.Object
So what are you trying to do and which compiler and libraries are you using?
| |||
April 04, 2007 Re: shouldn't cast(Object)cast(void*)anything work? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Johan Granberg | i use dmd ;) it's astonishing for me to know gdc compiles it | |||
April 04, 2007 Re: shouldn't cast(Object)cast(void*)anything work? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Davidl | On Thu, 5 Apr 2007, Davidl wrote: > union __exp > { > Expression _m_exp; > int i; > } > > __exp EXP_CANT_INTERPRET; > > static this() > { > EXP_CANT_INTERPRET.i=1; > } > > and i don't get why i can't use the following work: > > //in order to get rid of the runtime extra var There's no extra 'runtime' anything involved here, just a more concrete expression of what you're trying to express than casting. > union _EXP_CANT_INTERPRET // coz we can't use an union as an instance > { > Expresssion _m_exp; > int i=1; > } > _EXP_CANT_INTERPRET EXP_CANT_INTERPRET; //compiler complains overlap > initializer?? strange > > and this won't work either: > > struct _EXP_CANT_INTERPRET > { > union > { > Expression _m_exp; > int i=1; //this would either complain overlap initializer of > struct _EXP_CANT_INTERPRET > } > } > _EXP_CANT_INTERPRET EXP_CANT_INTERPRET The 'problem' here is the initializer you've specified on the second member of the union. Take that out and the message would go away I suspect. I also suspect, though haven't tried, that if the int i was first rather than second, that the error would also go away. Later, Brad | |||
April 04, 2007 Re: shouldn't cast(Object)cast(void*)anything work? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Brad Roberts | i don't think compiler could eliminate the following :
union __exp
{
Expression _m_exp;
int i;
}
__exp EXP_CANT_INTERPRET
static this()
{
EXP_CANT_INTERPRET.i=1;
}
to :
simply cast(Expression)1;
while in runtime
return cast(Expression)1; would generate literal 1 and retn
and the example use union trick could possibly need to copy a var which holds the value of 1
and it's strange for the error message goes away when it becomes the first member ;)
:o because the first member's initializer is the union's default initializer?
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply