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

qt字符串转浮点数(qt字符转换)以下均为个人观点 由于 B 站专栏改版导致代码块显示有问题 以下均使用图片 假设我们要创造一门语言 不妨就取 rubbish 的末 4 个字母 叫做 Bish 那么 我们需要哪些原生数据类型 很自然的想法是 我们会需要 数 整数和浮点数 另外我们还会需要 bool 以及一个能够存储字符串的类型 字符 也就是 C 语言中的 char 又是否有必要存在呢 似乎长度为 1 的 string 也完全可以替代

大家好,我是讯享网,很高兴认识大家。



以下均为个人观点。

由于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()等特别的方法,不过这些都是后话了。

小讯
上一篇 2025-04-16 09:02
下一篇 2025-04-15 14:41

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/192455.html