鱼C论坛

 找回密码
 立即注册
查看: 1649|回复: 12

有没有方法分辨默认构造和={}的构造方法?

[复制链接]
发表于 2020-1-15 17:02:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
之前写variant的时候遇到一个问题,variant要同时支持list和整形。在初始化时,可以这样写
variant v1=123;     //整形
variant v2={123};//list类型

因为variant的构造函数,对于int是模板特化的,而对于initializer_list是非模板化的。
编译器会优先调用非模板化的函数,因此能正确分辨。

但是对于
variant v1;
variant v2={};
有什么方法能正确分辨这两种初始化方式么。?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-16 14:55:23 | 显示全部楼层
variant v1;
variant v2={};

对于这两行代码,都调用默认构造函数不行吗?
你为什么要分辨这两行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-16 18:29:59 | 显示全部楼层
人造人 发表于 2020-1-16 14:55
对于这两行代码,都调用默认构造函数不行吗?
你为什么要分辨这两行

做variant啊,我希望一个能识别成列表另一个能识别成空值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-16 18:30:47 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-16 18:48:21 | 显示全部楼层
在C++中大概是不行,我也找不到分辨这两行的办法
不过站在python的角度来看(也许是python的角度吧)
下面这样不行吗?
variant v1("{}");
variant v2={"{}"};
variant v3("[]");
variant v3("()");

在构造函数内部解析字符串,然后创建对应的类型
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-16 19:00:58 From FishC Mobile | 显示全部楼层
两种实现我都写了的,只是初始化列表的这种方法就这里有点瑕疵,我也没找出来方法完善。。。想看看有没有人有什么好的办法。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-16 19:02:12 | 显示全部楼层
既然要解析字符串,那解析一个空括号和解析一个非空元组也没什么区别吧
variant v1(R"((123, "abcd", True, {"x", "y"}, [100, 200]))");
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-16 19:05:47 | 显示全部楼层
我的意思是,只有一个接受字符串的构造函数,在这个构造函数内部解析字符串,然后创建对应的类型
如果你非要在C++中玩py,因为本来就不是同一个语言,语法肯定不同
在一个语言中找另一个语言的语法替代品,有时候真的找不到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-16 19:07:53 | 显示全部楼层
variant v1("(123, "abcd", True, {"x", "y"}, [100, 200])");
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-16 19:08:59 | 显示全部楼层
反斜杠怎么没了,再试一次
variant  v1("(123, "abcd", True, {"x", "y"}, [100, 200])");
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-16 19:09:46 | 显示全部楼层
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-16 19:46:34 | 显示全部楼层
我的意思是,只有一个接受字符串的构造函数,在这个构造函数内部解析字符串,然后创建对应的类型
如果你非要在C++中玩py,因为本来就不是同一个语言,语法肯定不同
在一个语言中找另一个语言的语法替代品,有时候真的找不到


你说的这个我已经写好了,虽然现在只支持list。tuple,set和dict还没实现。。。

你的意思不会是让我把其他的构造方式干掉吧。。。

初始化列表版的很符合c++的风格,而且还能传递变量,字符串版本的你想传递一个变量得有多难写。。。

我又不是想写个python,为什么要把传统的构造方式推倒啊- -
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-16 21:16:51 | 显示全部楼层
Croper 发表于 2020-1-16 19:46
你说的这个我已经写好了,虽然现在只支持list。tuple,set和dict还没实现。。。

你的意思不会是让我 ...

就是字符串版本的通用,因为编译器不对其进行解析,把解析的任务交给了你,这给了你很大的灵活性(好像有点太大了,^_^)

字符串处理么,也没有多难,简单点的用正则表达式就可以了,复杂点的可以用flex和bison么
不难,^_^

在C++中好像没办法识别这两种构造函数,至少在我的所学范围内没办法

那就再加一个字符串版本的,用来解析空的括号?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 08:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表