$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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