24小时热门版块排行榜    

CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2026级博士研究生招生报考通知(长期有效)
查看: 638  |  回复: 5

lixy1217

木虫 (著名写手)

[交流] STL中重载运算的问题

以vector的加法为例,首先想到的语法是

template<typename T>
vector<T>&operator+(vector<T>&a,vector<T>&b)
但是有一个问题,我们会希望不同类型(int、double、complex)之间的向量应该也是可以相加的。

而如果用两个类型名,写成如下
operator+(vector<T1>&a,vector<T2>&b)
我们又无法在定义的时候就知道该返回哪个类型的,显然int+double应该返回double,而double+complex该返回complex

而如果放弃对"+"的重载,而只重载"="和"+=",即 "c=a;  c+=b;"  的方式,这样看起来不舒服倒是小事,但我如果还想重载一个矩阵与向量的乘法那该怎么办呢?

还有一种方法,就是将"小"的向量赋值给"大"的向量,达到类型统一后再进行计算,可这样的话就可能要多出很多计算量。 例如complex+complex是double+complex的两倍,而complex*complex大概是double*complex的三倍。

这方面,Matlab似乎很好的解决了此问题,但不知道用了什么样的办法。

当然还是更希望能听到各位的高见~
回复此楼
偶尔敞开心扉,世界将不再孤独
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dlmufei

木虫 (小有名气)

★ ★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
lixy1217: 金币+2 2015-09-15 16:00:18
之所以STL没有这样实现就是有你说的这种原因,我感觉要想解决就得在这门语言刚开始设计数据类型的时候给你设计好。如果让咱们重新设计数值类型,或者你可以自己定义一个数值类型的库,所有数据的表示都用自定义的类型来表示的话,你说着这个问题完全可以通过多态机制实现的。
Matlab之所以能实现你说的这个问题,就是因为Matlab的弱数据类型,这和语言刚开始的设计用途是有密切关系的!
牛逼是自己干出来的!
2楼2015-09-15 12:29:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
2楼: Originally posted by dlmufei at 2015-09-15 12:29:09
之所以STL没有这样实现就是有你说的这种原因,我感觉要想解决就得在这门语言刚开始设计数据类型的时候给你设计好。如果让咱们重新设计数值类型,或者你可以自己定义一个数值类型的库,所有数据的表示都用自定义的类 ...

可是Matlab不说是基于C++之上的吗?那就应该能用C++做到这一点吧?
偶尔敞开心扉,世界将不再孤独
3楼2015-09-15 16:01:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dlmufei

木虫 (小有名气)


小木虫: 金币+0.5, 给个红包,谢谢回帖
引用回帖:
3楼: Originally posted by lixy1217 at 2015-09-15 16:01:34
可是Matlab不说是基于C++之上的吗?那就应该能用C++做到这一点吧?...

1、Matlab怎么大的软件怎么可能是C++一种语言编写的,里面包含C/C++、Java以及一些脚本语言等。
2、MatLab只是M语言的的一个IDE,和语言本身没有关系。
3、一种语言的解释、编译等操作是由语言当初设计时决定的,就是一种规则的制定而已,后面的开发工具只是规则的实现,与实现的语言没有关系。
牛逼是自己干出来的!
4楼2015-09-15 17:10:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

chanchancl

新虫 (初入文坛)

★ ★ ★ ★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
lixy1217: 金币+4, 谢谢参与 2015-09-18 09:20:57
1。 对于模板返回值类型,可以使用C11的新关键字 delctype 可以让编译器预推断类型,详情自己搜索下。
2。这属于模板方面的问题,建议你多看下相关的书籍。实现起来没有你说的效率问题。

[ 发自小木虫客户端 ]
5楼2015-09-17 09:23:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
5楼: Originally posted by chanchancl at 2015-09-17 09:23:01
1。 对于模板返回值类型,可以使用C11的新关键字 delctype 可以让编译器预推断类型,详情自己搜索下。
2。这属于模板方面的问题,建议你多看下相关的书籍。实现起来没有你说的效率问题。
...

看起来,auto和delctype的组合应该是能解决我提出的问题,但不知道哪个版本的C++能够支持C++11这样的语法,我用的是VS2010,貌似是没有这样的定义方式的。
偶尔敞开心扉,世界将不再孤独
6楼2015-09-18 09:22:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 lixy1217 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见