Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Best practice for managing application parameters?

Reply
Thread Tools

Best practice for managing application parameters?

 
 
stephen.diverdi@gmail.com
Guest
Posts: n/a
 
      11-10-2008
I have a question about what's the best way to handle something in C++
without a lot of redundant code and void*s because I don't seem to be
able to avoid them both. I've run into it before and always sort of
hacked something together, but I'd really prefer a more elegant
solution.

I have a parameter struct that I store some values of varying type in:

struct params_t
{
int count;
bool render;
float alpha;
};
params_t params;

This struct gets used many different places. For example, it can be
filled with values from a dialog box like:

params->count = Dialog->GetIntegerValue( kParamsCountItem );
params->render = Dialog->GetBooleanValue( kParamsRenderItem );

where kParamsCountItem and kParamsRenderItem are static constants.
Creating the dialog box uses similar functions to set default values:

Dialog->SetIntegerValue( kParamsCountItem, 1 );
Dialog->SetBooleanValue( kParamsRenderItem, false );

There's other code the struct has to interact with that operates more
like this:

dictionary->GetIntegerValue( "count", &params->count );
dictionary->GetFloatValue( "alpha", &params->alpha );

Currently, every time I add a new paramter, or I change a default
value or something, I have to edit a bunch of different things - I
need to update the places where default values are set, I need to add
functions to the dialog handling code, I need to add lines to the
dictionary handling code, etc. This is spread over a couple files and
is tedious and error-prone. I'd like to have something where I define
the set of available parameters in one place statically, and then each
of these separate functions (i.e. dialog, dictionary, etc.) just
iterates over a the set of available parameters. The trouble is my
parameters are different types. Here's the kind of thing I'm looking
at now (which I recognize is a mess):

enum { TYPE_NONE = 0, TYPE_INT, TYPE_BOOL, TYPE_FLOAT };
struct param_spec_t
{
int type;
size_t offset;
const char *str;
float defaultval;
int dialog_id;
};

static const param_spec_t param_spec[] = {
{ TYPE_INT, offsetof( params_t, count ), "count", 1.0f,
kParamsCountItem },
{ TYPE_BOOL, offsetof( params_t, render ), "render", 0.0f,
kParamsRenderItem },
{ TYPE_FLOAT, offsetof( params_t, alpha ), "alpha", 0.5f,
kParamsAlphaItem },
{ 0, 0, NULL, 0, 0 } };

This makes the code to interact with e.g. the dialog box unpleasant:

params_t *params;
for( int i = 0 ; param_spec[ i ].type ; ++i )
{
void *ptr = ( ( void * )params ) + param_spec[ i ].offset;
switch( param_spec[ i ].type )
{
case TYPE_INT:
*( int * )ptr = Dialog-
>GetIntegerValue( param_spec[ i ].dialog_id );

break;
case TYPE_BOOL:
*( bool * )ptr = Dialog-
>GetBooleanValue( param_spec[ i ].dialog_id );

break;
case TYPE_FLOAT:
*( float * )ptr = Dialog-
>GetFloatValue( param_spec[ i ].dialog_id );

break;
}
}

Anytime I want to iterate through the parameters, this kind of mess is
necessary. So, what's a better way to accomplish this? I'd rather
not throw out type data and have to use these switch statements on an
enum, but how can I store a set of parameters of different types? And
how can I avoid the offsetof mess? Any suggestions are very welcome!
Thanks,

-stephen diverdi
http://www.velocityreviews.com/forums/(E-Mail Removed)
 
Reply With Quote
 
 
 
 
Martin Eisenberg
Guest
Posts: n/a
 
      11-11-2008
Hendrik Schober wrote:
> (E-Mail Removed) wrote:


>> I'd like to have something where I define the set of available
>> parameters in one place statically, and then each of these
>> separate functions (i.e. dialog, dictionary, etc.) just
>> iterates over a the set of available parameters. The trouble
>> is my parameters are different types. [...]

>
> Have a look at compile-time lists. Tuples (come with boost
> and TR1) might be what you're looking for.


Boost::Fusion can iterate over heterogeneous sequences.
http://www.boost.org/doc/libs/1_37_0...roduction.html


Martin

--
Quidquid latine scriptum est, altum videtur.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
hidden data - best practice, best way, suggestions oldyork90 Javascript 1 09-10-2008 07:46 PM
Best practice for managing jsp segments? Steve Java 3 01-06-2007 12:08 AM
Best Practice for Checking if user is logged into application =?Utf-8?B?TWlrZSBNb29yZQ==?= ASP .Net 1 06-22-2005 11:05 AM
Remember when your piano teacher taught you, "Practice, practice,practice ...?" Wayne Wastier Windows 64bit 3 06-10-2005 08:29 PM
Best Practice to spawn an Application from a Web Service ? Paul ASP .Net 3 10-13-2003 08:13 AM



Advertisments