如何在c++中实现任意类型存储,并支持流输入和输出

zxjluohe 2015-05-24 10:17:55
突发奇想c++中如何实现任意类型存储和流输入输出,下边代码自己瞎写的,实现不了,大牛请给个思路。

#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;
}
...全文
306 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxjluohe 2015-06-20
  • 打赏
  • 举报
回复
谢谢大家,简单参考boost实现了一个,功能不算完善但也能满足需求
ForestDB 2015-06-01
  • 打赏
  • 举报
回复
看看boost?
super_admi 2015-06-01
  • 打赏
  • 举报
回复
应该说,VARIANT的主要问题是使用方式太复杂。
引用 1 楼 zhao4zhong1 的回复:
参考VARIANT
super_admi 2015-06-01
  • 打赏
  • 举报
回复
VARIANT的实现方式太复杂了,参考boost库比较好。
引用 1 楼 zhao4zhong1 的回复:
参考VARIANT
翅膀又硬了 2015-06-01
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
参考VARIANT
++
jiqiang01234 2015-05-31
  • 打赏
  • 举报
回复
建议看一下boost的serialization库
赵4老师 2015-05-25
  • 打赏
  • 举报
回复
参考VARIANT

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧