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可以看成一个函数

如果您能够坚持看到这里,我表示由衷的感谢

0 0