Boost logo

Boost Users :

From: Robert Dailey (rcdailey_at_[hidden])
Date: 2008-05-01 19:40:01


Hey guys,

I was wondering if there was some sort of MPL Switch concept in the boost
library. Before I go any further on that topic, let me first explain what
I'm trying to do.

I'm currently using a library that has several functions as follows:

void SetParamFloat( char* name, float value );
void SetParamInt( char* name, int value );
void SetParamString( char* name, char* value );

I'm creating a sort of facade around this library, and as a result I have a
function that looks as follows:

template< typename t_type >
void SetParam( char* name, t_type value );

What I need to do is map real types to function pointers, obviously. But I
want all of this to be done at compile time, since I have all of the
information to do so. My first thought on a solution to this problem was
boost::mpl::map, but then I thought to myself: How do I pass function
pointers as template arguments? And on top of that, since all of the
functions I'd be mapping to types all have different types anyway, creating
a functor object for function pointers seems difficult as you would have to
do a lot of messy template class specializations. We'd have to wrap the
function pointers in functors of some sort because boost::mpl::map requires
typed template arguments, instead of non-type template arguments.

This is what brings me to a sort of switch concept. If there was such a
concept in the boost library, it might be more likely to hide the boiler
plate code required simply to get to the point to where I can start adding
items to a boost::mpl::map. I realize there is no boost::switch concept (at
least that google shows), but I was wondering if there was something like
it. As a pseudo code example, I would want the logic of my new function to
work as follows:

template< typename t_type >
void SetParam( char* name, t_type value )
{
    switch( t_type )
    {
    case float:
        {
            SetParamFloat( name, value );
            break;
        }

    case int:
        {
            SetParamInt( name, value );
            break;
        }

    case char*:
        {
            SetParamString( name, value );
            break;
        }
    }
}

Any help is greatly appreciated. I guess what I really need is some guidance
on the matter. I strive for a generic way to implement this, but I don't
want it to look messy, as most template code has the bad habit of turning
out that way.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net