|
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