If you keep your objects in an array, you could do some sort of hacky stuff like this:
Code:
myStruct structArray[20];
float * pMember;
switch( key )
{
case 1: pMember = &structArray[0].f1; break;
case 2: pMember = &structArray[0].f2; break;
}
for( int i = 0; i < 20; i++ )
{
draw( pMember );
pMember += sizeof( myStruct );
}
That only works if you know the memory is contiguous. If it's not contiguous, instead of storing a pointer to the member, you can store a byte offset.
Code:
LinkedList<myStruct> structList( 20 ); //makes a linked list with 20 myStructs
unsigned int memberByteOffset;
switch( key )
{
// you can make macros that will calculate the offset of a member given the class/struct name
// and the member name, but I'll let you figure that part out if you choose this solution
case 1: memberOffset = 0; break;
case 2: memberOffset = 4; break;
}
// probably would have an iterator of sort for a list, but this makes for an easy example
for( int i = 0; i < 20; i++ )
{
byte * p = (byte *)&structList->Get( i );
draw( ( (float*)( p + memberByteOffset ) )
}
OR, you can use member pointers, which is safer because it's C++'s built in mechanism for doing the memberByteOffset trick.
Code:
myStruct structArray[20];
float myStruct::* pMember;
switch( key )
{
case 1: pMember = &myStruct::f1; break;
case 2: pMember = &myStruct::f2; break;
}
for( int i = 0; i < 20; i++ )
{
draw( structArray[i]::*pMember );
}