[讨论] boost::variant有没有更好的做法?

楼主: Killercat (杀人猫™)   2017-09-05 16:40:51
算半个作业文吧 (?) 不过是写专案的时候碰到的问题
我们有一组Data Access Layer,之前为了让他能方便吃下所有型态
所以Value的部分用boost::variant,如下这样
typedef boost::variant<std::string, int, char*> ValueType;
ValueType get(const std::string&& key);
void set(const std::string&& key, ValueType value);
然后把它们存在一组map里面
std::map<std::string, ValueType> map;
当然使用上并没有想像中那么方便啦,这是后话(尤其是get,真的是欧麦尬)
不过看起来也算能用就是了
对于boost::variant使用比较熟的同学应该就知道他能吃三个值了
(本例来讲就是std::string, int, char*)
但是在做serialization的时候,发现boost::serialization对这种case简直无解
std::stringstream ss;
boost::archive::text_oarchive ar(ss);
ar << map;
std::cout << ss.str() << std::endl;
会跑出一大组壮观的错误,当然,身为专业的C++码农,本来就不期待boost无痛搞好
所以就开始自己认命的写serialization了
void SimpleDevDBSpace::serialize(const std::string&& folder) {
for(auto i : map) {
//Use reference to improve performance
const std::string& name = i.first;
ValueType& value = i.second;
switch(value.which()) {
当然这对大多数人来讲都已经good enough了,但是我总觉得心里痒痒的
value.watch()传回来的是order,也就是0 = string, 1 = int, 2 = char*
但是这不够泛用,如果今天把variant型别改成<int, std::string, float, long>
这样的话还要记得去改value.which的case handle,这显然是有点问题的
所以我的需求是,有没有什么方法可以让std::string, int, char* 成为一个array
让我需要增加支援type时,改一个地方即可,有点像这样
TypeArray ARR = {std::string, int, char*};
typedef boost::variant<{ARR}> ValueType;
而且这个可以被轮询
我知道value还额外一个提供value.type(),不过我想不出他对我的需求有什么用
他用了一个很类似loki的Type2Int的方法,但是我找不到公开方法可以去转
有人可以给我一点建议吗?虽然我觉得这需求已经有点龟毛了.....
作者: Caesar08 (Caesar)   2017-09-05 16:49:00
any?
楼主: Killercat (杀人猫™)   2017-09-05 16:57:00
any无法限制型别,client爱塞啥就塞啥,会对应到死...就是因为要明确定义支援type 所以才用variant的
作者: PkmX (阿猫)   2017-09-05 17:05:00
用visitor不能吗?
楼主: Killercat (杀人猫™)   2017-09-05 17:06:00
variant是有原生支援visitor没错啦... 恩我研究看看反正都要有个地方针对type去handle serialize就是了这样的话看能不能印得出“缺某种type的serializer”的错误来提醒使用者...不过visitor是可以试试 只是写法可能会比较不值观附带一提 boost::serialization::variant.hpp是用visitor没错 只是针对map的话...搞不好可以直接用只要自己处理map的部分就好(抓头)
作者: PkmX (阿猫)   2017-09-05 17:49:00
楼主: Killercat (杀人猫™)   2017-09-05 17:49:00
感谢 让我试试看 //bow
作者: PkmX (阿猫)   2017-09-05 17:53:00
楼主: Killercat (杀人猫™)   2017-09-05 17:53:00
btw, 原来C++17把variant收到std了啊...
楼主: Killercat (杀人猫™)   2017-09-05 17:59:00
真是个好消息 我看看project能不能支援 XD
作者: CoNsTaR ((const *))   2017-09-06 02:53:00
像 idris 的 HVect 一样吗?

Links booklink

Contact Us: admin [ a t ] ucptt.com