1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| struct IBinding : boost::noncopyable
{
virtual ~IBinding(){}
virtual void assign(std::string const& strValue) = 0;
};
template <typename T> BindingImpl : IBinding
{
BindingImpl(T & data) : data_(data) {}
virtual void assign(std::string const& strValue) {
data_ = boost::lexical_cast<T>(strValue);
}
private:
T & data_;
};
struct BindingsTable : boost::noncopyable
{
template <typename T> void bind(std::string const& id, T & data) {
m_table[id] = new BindingImp<T>(data);
}
void assign(std::string const& id, std::string const& strValue) {
m_table[id] -> assign(strValue);
}
~BindingTable() {
std::foreach(m_table.begin(), m_table.end(), DeleteSecond());
}
private:
std::map<std::string, IBinding*> m_table;
};
...
{ // les vraies données
int toto;
std::string titi;
// la préparation
BindingTable table;
table . bind ( "toto", toto);
table . bind ( "titi", titi);
....
// la désérialization
table.assign( "toto", "42");
table.assign( "titi", "chaine");
} |