当前位置:网站首页 > 编程语言 > 正文

qt字符串转浮点数(qt字符转换)



以下均为个人观点。

由于B站专栏改版导致代码块显示有问题,以下均使用图片。

假设我们要创造一门语言——不妨就取rubbish的末4个字母,叫做Bish——那么,我们需要哪些原生数据类型?

很自然的想法是,我们会需要“数”——整数和浮点数。另外我们还会需要bool,以及一个能够存储字符串的类型。

“字符”——也就是C语言中的char——又是否有必要存在呢?似乎长度为1的string也完全可以替代。为了简单起见,不妨就抛弃char类型吧。否则,list of char(或者说char*)和string两者竟然不统一,恐怕用起来也不会简单。(点名C++)

当然这个string会直接使用Unicode,不然可能又会是一片混乱……(再次点名C++:char,wchar_t,string,wstring)

现在我们有了表示整数的int,表示实数的num,表示布尔的bool,以及表示字符串的string。看起来,基本数据类型已经足够了……?

让我们思考一个问题——如何实现一个print函数,它能够打印各种不同类型的数据?

听起来很简单。我们只需要利用好多态,实现每种数据类型的print方法:

很显然,这样的方法不仅不优雅,更重要的是——用户该如何允许自己定义的类被print作为参数打印?

一个典型的C++做法是,我们要求用户实现.toString()方法,然后用模板调用这个可能存在的函数:

这样一来,当用户实现了toString方法,print函数就可以直接调用这个方法;而当用户没有实现,编译时模板就会报错。

为什么说这是一个“典型的C++做法”?例如说,在C++中,要让自定义的类能够被for语句遍历(指C++11的遍历语法),需要实现的就是类的iterator和.begin()、.end(),还有一大堆其它的东西。

我并不认为这是一个优雅的做法。因为,这样一来,用户在定义自己的类的时候,只有去查阅资料才能知道有哪些方法是需要被实现的;而且,模板报错多少有点太难读懂了。当然C++也有方法在模板主体前就判断出一个类型有没有toString方法,但是这又涉及到更艰深的模板编程,在我看来无论如何都难以达到让双方都写得优雅的方法。

在我看来,模板是C++最强大的特性,但也是最烂的特性。因为它过于强大,以至于掩盖了一些本该有更简单的解决方案的问题。

这样的解决方案是否存在呢?事实上C#已经为我们指出了方向——接口。

C#中,接口可以被视为一种特殊的类,它只包含若干需要被实现的方法,而不包含它们如何被实现。一个类可以继承多个接口,但只能继承1个父类。

举个栗子:

接下来我们随意实现一个接口:

这就是优雅的实现方法。

回到bish,我们有了这样的一个print函数:

假设有一天,我们突发奇想,要在print中增加这样一个彩蛋:每年的12月25日,所有string打印出来的结果都会是“Merry Christmas!”(奇怪,这一定不是在说某知名互联网公司的某个名字有4个字母并且其中有1个元音字母和3个辅音字母的开源框架吧?)

很自然的解决方法是,再次多态:

在此暂且不细究编译器是如何知道要选择哪个函数的(毕竟string也应该是IPrintable)——大致地说,调用第一个函数的时候string到IPrintable经过了一次隐式的向上转型,而编译器选择了转换较少的一种方式。

但这一点都不优雅,也缺乏一些可拓展性。例如,我们想要实现print所有可枚举的对象,很自然地想到:

那么,如果我们再实现一个类,它同时是IPrintable和IEnumable,编译器该怎么选择呢?毕竟两者的转换次数可是没有区别的。

让我们请出“类型的类型”——type:

唯一的问题就是,这样一来编译期就发现不了问题了呢……不过嘛、这个问题可以留到以后再来解决。或许我们可以用IPrintable | IEnumable一类的语法来指示编译器这个参数的可选类型?

先抛开这个不谈,这里有2个问题:

Q1:我们用来switch的data.type()是什么类型?

——是type类型。

type是一种非常特殊的类型,让我们直接看一个demo:

当然,用户定义的类型也是type。

Q2:为什么所有类型都有.type()方法?能够在自定义的类中重写它吗?

——从原理上讲,type是编译器为类生成的方法,当然也不能被继承。

当然,也可以理解为所有的类都继承者一个最大的父类,这个父类包含着type方法;不过这样似乎会遇到一点多继承的问题。

后面会讲到,可以声明类的成员函数使得它“不能被子类重写”。

顺便提前说一句,在bish中函数func也是对象——由此,运算符operator当然也是。它们都派生自executives,具有exec和operator()等特别的方法,不过这些都是后话了。

到此这篇qt字符串转浮点数(qt字符转换)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 怎么关闭程序运行快捷键(怎么关闭程序运行快捷键)2026-04-22 17:45:04
  • 我的世界设置指令权限(我的世界给指令权限)2026-04-22 17:45:04
  • aqdtv2023vip域名查询(1238ip域名查询)2026-04-22 17:45:04
  • 打印机共享失效(打印机共享失败)2026-04-22 17:45:04
  • wps怎么打开目录导航(wps怎么打开目录导航pdf)2026-04-22 17:45:04
  • 学籍认证码和在线验证码一样吗(学籍认证码和在线验证码一样吗怎么查)2026-04-22 17:45:04
  • ubuntu系统源(ubuntu20源)2026-04-22 17:45:04
  • ngff接口和m.2接口通用吗(ngff接口和m2接口通用吗)2026-04-22 17:45:04
  • Ubuntu镜像源(ubuntu镜像源制作)2026-04-22 17:45:04
  • 进程控制块是进程存在的唯一标志吗(进程控制块是进程存在的唯一标志吗)2026-04-22 17:45:04
  • 全屏图片