国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

奇技淫巧C++之語法魔力球

2019-11-17 05:28:06
字體:
來源:轉載
供稿:網友

  很想寫一個C++技巧的系列,但是苦于沒有時間。嗯...我承認,說沒有時間是借口,沒有積累才是真的。就把這里當作垃圾堆,想到什么,就吐點什么吧。可別指望吐出來的都是什么好東西。

  C++新手經常會寫這樣的代碼:

if ( i < x < j) { ....}
  很不幸,通常編譯器都不會報錯,有些甚至連警告都沒有,包括聞名的GCC.

  程序員的目標其實是這樣的:

if (i < x && x < j)
  但是,很顯然,正確的寫法很啰嗦,第一種寫法更符合數學上自然的表達。想不想讓自然的表達方法行為正確呢?我們可以嘗試一下如何實現。有人把這種好處稱做語法糖,以示不屑。可是,語法糖有什么不好呢?進而,有什么不是語法糖?

  代碼如下:

template<typename T>
strUCt compare
{
 bool result;
 const T& rsh;
 compare(bool res, const T& v): result(res), rsh(v){}
 template<typename U>
 inline friend compare<U> Operator < (const compare& lsh, const U& rsh)
 {
  return compare<U>(lsh.result && lsh.rsh < rsh, rsh);
 }

 bool operator!() const
 {
  return !result;
 }

 operator bool() const
 {
  return result;
 }
};
  代碼很簡單,首先要聲明的是,這不是一個嚴謹的實現,這里面有毒藥,那位看官要是吃錯了藥中毒身亡,于我無關。這里只大概解釋一下技巧的本質。

  這里最要害的地方就在于operator<并不是返回一個bool結果,而是返回一個結果的代理,這個代理可以自然地轉換成bool型。我重載了operator!和operator bool,這里重載operator bool而不是unspecificial_bool完全是合理的。不直接提供結果,而是返回一個代理作為間接層,然后在間接層插入我們需要的處理,這是一個常見的也是重要的處理問題的思路。但是有個重要的方面沒有實現,就是對const, volatile的支持沒有做好。另外,對于參數,應該通過calltraits來選擇。

  另一個方面,當然,這里只實現了<,實際上,還需要其他操作符:

>,>=, <=, ==, !=
  以至于混合使用。小心別栽倒在優先級腳下。測試代碼如下:

using namespace std;
int main()
{
 int i = 30;
 int j = 40;
 if ( compare<int>(true, 2) < i < j < 50)
 {
  cout << "OK." << endl;
 }
 if ( compare<int>(true, 2) < i < 35 < 38 < j < 42)
 {
  cout << "OK." << endl;
 }
 if ( compare<int>(true, 2) < i < j < 40)
 {
  cout << "ooo." << endl;
 }
 return 0;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浏阳市| 清远市| 古浪县| 若羌县| 庆元县| 吴旗县| 东光县| 云南省| 西青区| 刚察县| 搜索| 南宫市| 东宁县| 腾冲县| 靖西县| 通许县| 海南省| 北流市| 龙江县| 蓝田县| 东平县| 旬阳县| 肇东市| 钦州市| 游戏| 普陀区| 兴山县| 广西| 汤原县| 万荣县| 石柱| 广水市| 福清市| 甘南县| 富川| 法库县| 亳州市| 苍山县| 云和县| 崇左市| 博爱县|