65,187
社区成员




#pragma once
#include <boost/any.hpp>
#include<iostream>
#include <string>
#include <map>
#include <boost/bind.hpp>
#include <boost/function.hpp>
class DynamicData
{
public:
typedef std::map<std::string, DynamicData>::iterator child_iterator;
typedef std::map<std::string, DynamicData>::const_iterator child_const_iterator;
DynamicData(){}
template<typename T>
DynamicData(std::string name, T t) : _name(name), _data(t)
{
//初始化输入输出函数
//_print = bind(operator<<(), _1, t);
//_scanf = bind(operator>>(), _1, t);
}
~DynamicData(){}
std::string get_name(){ return _name; }
void set_name(std::string name){ _name = name; }
template<typename T>
bool is_kind_of(){ return _data.type() == typeid(T); }
bool valid() const{ return _data.empty(); }
const std::type_info& type() const { return _data.type(); }
template<typename T>
void set(T t)
{
_data.clear();
_data = t;
//初始化输入输出函数
_print = bind(operator<<(), _1, t);
_scanf = bind(operator>>(), _1, t);
}
template<typename T>
T& get()
{
assert(is_kind_of());
return *any_cast<T>(&_data);
}
template<typename T>
const T& get() const
{
assert(is_kind_of());
return *any_cast<T>(&_data);
}
int child_count(){ return _children.size(); }
DynamicData& get_child(const std::string& name){
child_iterator it = _children.find(name);
if (it != _children.end()){
return it->second;
}
else{
return DynamicData();
}
}
const DynamicData& get_child(const std::string& name) const
{
child_const_iterator it = _children.find(name);
if (it != _children.end()){
return it->second;
}
else{
return DynamicData();
}
}
void add_child(DynamicData child)
{
if (child.valid())
{
_children[child.get_name()] = child;
}
}
void remove_child(std::string name)
{
child_iterator it = _children.find(name);
if (it != _children.end()){
_children.erase(it);
}
}
bool operator!()
{
return valid();
}
friend std::ostream& operator <<(std::ostream& outs, const DynamicData& data);
friend std::istream& operator <<(std::istream& ints, DynamicData& data);
private:
boost::function<void(std::ostream&)> _print;
boost::function<void(std::istream&)> _scanf;
std::string _name;
boost::any _data;
std::map<std::string, DynamicData> _children;
};
std::ostream& operator <<(std::ostream& outs, const DynamicData& data)
{
if (data.valid())
{
data._print(outs);
}
return outs;
}
std::istream& operator <<(std::istream& ints, DynamicData& data)
{
data._scanf(ints);
return ints;
}