Boost logo

Boost :

From: Maxim Yegorushkin (e-maxim_at_[hidden])
Date: 2004-09-23 13:52:57


I was working on some code where I got some parameters as pairs of strings
[name, value]. In my code I needed to convert those values to int's,
doubles, etc (i.e. deserialize). And I wanted to convert them in bunch. I
thought it was a great job for lexical_cast and tuple::tie.

The only thing I missed was something like for_each for tuples. Is there
going to be such a mechanism?

Here is an example:

template<class T, class F>
inline void for_each(boost::tuples::cons<T, boost::tuples::null_type>
const& tuple, F f)
{
     f(tuple.get_head());
}

template<class T, class U, class F>
inline void for_each(boost::tuples::cons<T, U> const& tuple, F f)
{
     f(tuple.get_head());
     for_each(tuple.get_tail(), f);
}

struct printer
{
     template<class T>
     void operator()(T& t) const
     {
         cout << typeid(t).name() << " (" << t << ")\n";
     }
};

typedef std::map<std::string, std::string> parameters;

struct lexical_caster
{
     parameters const* p;
     char const* name;

     template<class T>
     void operator()(T& t)
     {
         parameters::key_type const k(name);
         parameters::const_iterator i(p->find(k));
         if(p->end() == i)
             throw std::runtime_error("a parameter is not found");
         t = boost::lexical_cast<T>(i->second);
         name += 1 + k.size();
     }
};

int main()
{
     bool b(1);
     char c('a');
     int i(12345);
     double d(3.1428);

     for_each(boost::tie(b, c, i, d), printer());

     parameters p;
     p["bool"] = "0";
     p["char"] = "b";
     p["int"] = "67890";
     p["double"] = "1.6";

     lexical_caster l = { &p, "bool\0char\0int\0double\0" };
     for_each(boost::tie(b, c, i, d), l);

     for_each(boost::tie(b, c, i, d), printer());
}

-- 
Maxim Yegorushkin

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk