C++的问题及改进畅想
来源:互联网 发布:七日杀该数据 编辑:程序博客网 时间:2024/05/16 19:50
假设有一个数学矩阵库Matrix2<>
Matrix2<double> A=B+C;
你也许会想到
Matrix2<T> operator+(const Matrix2<T>&,const Matrix2<T> &)
好吧,这样数据很大的话效率会很低,也许你会想到表达式模板,但表达式模板的问题在于编译时间较长最重要的是对于一些复杂的式子比如
Matrix2<double> A= sin(C)+C+B-(D+A);
这样的式子表达式模板能够胜任吗?如果能那么表达式模板得有多复杂啊…..
于是乎可能就要使用一些不太美观的做法
template<typename T>
void add(const Matrix2<T> & Left,const Matrix2<T> & Right, const Matrix2<T> & Ans);
于是A=B+C;便写成add(B,C,A);
似乎解决了问题但是比如一个广义函数 (y1,y2,y3…)=fun(x1,x2,x3….)
我们就不得不写成fun(x1,x2,x3,….,y1,y2,y3)
或者写成 fun(tuple<…..>,tuple<…..>)
额这实在太恶心了…….
其实问题的根源就在于C++语言对于等式的抽象做的不好
C++对于等式的抽象为:
LeftExp=RightExp
乍看是一个完美的抽象,包括三个部分 LeftExp,RightExp以及一个operator=,可是RightExp完全不知道LeftExp,也就是RightExp无法获得LeftExp的指针,也就是在RightExp里面调用LeftExp的资源是不可能的.上述便是造成Matrix2<double> A=B+C;低效或者写成很难看的写法的根本原因
我们为何不将LeftExp=RightExp看成一个表达式(函数)呢好吧我知道有些人没有代码就无法思考如果将 LeftExp=RightExp看成一个表达式(函数)并转换为C++表达方法大概就是如下的样子
(declytype LeftExp) operator= Exp (Left,Right)
额太抽象不想看???
好吧Matrix2<double> A=B+C;看成一个式子(函数)就是
declytype(A) operator= operator+(A,B,C)
不得不说上式看得怪怪的,因为
A=B+C的前缀表达法为=A+BC
A=B+C的后缀表达法为 ABC+=
而operator= operator+(A,B,C)既不是前缀也不是中缀更不是后缀一个四不像
我们考量LeftExp=RightExp
前缀表达为=LeftExp RightExp(哈哈熟悉吗这就是我们常写的friend operator= )
后缀表达为LeftExp RightExp =
而做算式分析的时候我们常用的是后缀表达法,于是我们尝试将A=B+C化成一个函数并用后缀表达法表示那就是
declytype(A) (A,B,C) operator+ operator=
乍看很不顺眼因为函数名operator+ operator=跑到了()的后面,但是这样表达具有理论基础和现实意义
好吧就算接受了declytype(LeftExp) (LeftExpType &,const RightExpTypes&) Exp operator=这种古怪的写法,这种写法比
template<typename T>
void add(const Matrix2<T> & Left,const Matrix2<T> & Right, const Matrix2<T> & Ans);
除了美观一些也没有任何优越性啊
我们再看下一个例子
A=B+C+D;
这个用void add(const Matrix2<T> & Left, const Matrix2<T>& Right, const Matrix2<T> & Ans);
便无法表达了
可是用declytype(A) (A,B,C) operator+ operator=也同样无法表达啊,你如是说(如果你现在还有兴趣看下去并且看懂了的话……)
将A=B+C+D;转为后缀为ABC+D+=
一开始我们只关注第一个+将其他(除了最后的=)用…代替就是
ABC+…= (这里…代替D+)
计算完之后,将BC+用A替换原式变为
AAD+…= (这里…为void)
计算完之后,将AD+替换为A
AA=
进行计算(就是A=A),最后得到A
哈哈,发现了吗,上述就是编程常用的迭代
于是乎declytype(A) (A,B,C) operator+ operator=写成
declytype(T) (T,T,T) operator+ … operator=让编译器自动迭代也就是了
为了能够求出下式,
Matrix2<double> A= sin(C)+C+B-(D+A);
程序只需要提供
Matrix2<double> & (Matrix2<double>&,const Matrix2<double> &,cosnt Matrix2<double> &)operator+…operator=
Matrix2<double> &(Matrix2<double> &,const Matrix2<double> &,cosntMatrix2<double> &)operator-…operator=
Matrix2<double> &(Matrix2<double> &,const Matrix2<double> &)sin…operator=
就可以了
总而言之,希望C++提供包含=的后缀表达式语法即
LeftType & (LeftType &,constRightTypes&….)Fun operator=
LeftType & (LeftType &,constRightTypes&….)Fun … operator=
LeftType & (LeftType &,constRightTypes&….)Fun operator+=
LeftType & (LeftType &,constRightTypes&….)Fun … operator+=
…….
这种写法使得 LeftExp=RightExp可以看成一个函数
如果您能够坚持看到这里,我表示由衷的感谢
- C++的问题及改进畅想
- 二维码彩色广告招牌的切割制作问题(C#.net下对彩色二维码圆角样式及改进)
- 第四代组网模块存在的问题及改进方法
- Flash动画课堂教学的问题及改进措施
- 公平的畅想
- 千里马的畅想
- 畅想web的未来
- 云端的畅想
- 对图形学的畅想
- 畅想seo的美好未来
- 未来计算机及外设畅想
- memset的实现及改进
- IT运维存在问题及改进
- 问题的解决与改进
- 畅想2008年的我
- 09年,新的畅想```
- 关于条码应用的畅想
- 我的。Net专业畅想
- 15件事造就有理想的程序员
- Encoding videos in H264
- maxscript 渲染输出的图片颜色有问题
- ContentProvider与ContentResolver使用
- 《实用OpenCV》<三> OpenCV内置Demo (1)
- C++的问题及改进畅想
- VM虚拟机问题集锦
- Nginx rtmp协议的流媒体服务器
- 动画演示平衡二叉树旋转
- K-L变换
- 第十天:国际化处理
- 网络视频服务器与数字硬盘录像机的区别
- Java多线程编程总结
- 周鸿祎:像打游戏一样去做自我激励