digitalmars.D.learn - struct aliases
- Kenny B (28/28) Nov 14 2007 Ok, I have reduced my code to a simple example... This is what I have:
- torhu (12/29) Nov 14 2007 I think this is planned for D 2.0, you will be able to put something
- Jarrett Billingsley (33/49) Nov 14 2007 It seems like it's almost possible:
- 0ffh (18/31) Nov 14 2007 No sweat!
- Jarrett Billingsley (19/34) Nov 14 2007 almost:
Ok, I have reduced my code to a simple example... This is what I have:
class MyClass {
struct Data {
int val1;
int val2;
}
Data data;
void one_function() {
// stuff
}
}
MyClass c = new MyClass;
// I want to say this:
c.val1 = 5;
// not this:
c.data.val1 = 5;
---------------
I tried to alias the data.val1 val1 -- but it doesn't work. I know this
works though...
int val1;
alias val1 val2;
val2 = 5;
assert(val1 == val2);
How can I do that with the structs?
I'm using gdc 0.24 on x86_64
Thanks in advance,
Kenny
Nov 14 2007
Kenny B wrote:
Ok, I have reduced my code to a simple example... This is what I have:
class MyClass {
struct Data {
int val1;
int val2;
}
Data data;
void one_function() {
// stuff
}
}
MyClass c = new MyClass;
// I want to say this:
c.val1 = 5;
I think this is planned for D 2.0, you will be able to put something
like 'alias data this;' in the class. Then you get the effect you want.
Maybe you could just use a template mixin to get the effect you want?
Depends on what you're really trying to achieve, of course.
template Data {
int val1;
int val2;
}
class MyClass {
mixin Data;
}
Nov 14 2007
"Kenny B" <funisher gmail.com> wrote in message
news:fhfkvd$3fc$1 digitalmars.com...
Ok, I have reduced my code to a simple example... This is what I have:
class MyClass {
struct Data {
int val1;
int val2;
}
Data data;
void one_function() {
// stuff
}
}
MyClass c = new MyClass;
// I want to say this:
c.val1 = 5;
// not this:
c.data.val1 = 5;
It seems like it's almost possible:
class C
{
struct Data
{
int x, y;
}
Data data;
alias data.x x;
alias data.y y;
}
void main()
{
C c = new C();
c.x = 5;
Stdout.formatln("{}", c.data.x); // error
}
The error it gives is "this for x needs to be type Data, not type C". I'm
surprised that the aliases even compile, though. I guess they're not really
expressions in the normal sense.
You could also try making Data an anonymous struct:
class C
{
struct
{
int x, y
}
}
And now those will be accessible through C references, but now you no longer
have the Data type and can no longer access both those members as a single
item..
Nov 14 2007
Jarrett Billingsley wrote:
You could also try making Data an anonymous struct:
class C
{
struct
{
int x, y
}
}
And now those will be accessible through C references, but now you no longer
have the Data type and can no longer access both those members as a single
item..
No sweat!
class C
{
union
{
struct data
{
int x, y;
}
struct
{
int x, y;
}
}
}
Unions to the rescue! =)
Regards, Frank
Nov 14 2007
"0ffh" <frank frankhirsch.youknow.what.todo.net> wrote in message
news:fhfrgv$l4p$1 digitalmars.com...
No sweat!
class C
{
union
{
struct data
{
int x, y;
}
struct
{
int x, y;
}
}
}
almost:
class C
{
union
{
struct Data
{
int x, y;
}
Data data;
struct
{
int x, y;
}
}
}
Course those members could be put into a template and then mixed in.
Nov 14 2007
Jarrett Billingsley wrote:almost: [...] Course those members could be put into a template and then mixed in.:-P
Nov 14 2007
0ffh wrote:Jarrett Billingsley wrote:Dude, why didn't I ever think of unions! It's annoying to have to duplicate all of the data definitions, but I suppose I don't mind it. I used your first message, and it didn't quite work, but I arrived at this: (it's the same thing... as Jarrett's) class MyClass { struct Data { int val1; int val2; } union { Data data; struct { int val1; int val2; } } } The reason I have to preserve the Data array is because that class's data gets filled from memcache. In memcache, that data is just a block of bytes, so I copy the buffer from memcache into &data with Data.sizeof... Once the data is copied, it's really nice to be able to say MyClass.val1 :) Again, THANK YOU SO MUCH... I pulled my brain for hours trying to think of how. Kennyalmost: [...] Course those members could be put into a template and then mixed in.:-P
Nov 14 2007









torhu <no spam.invalid> 