国产探花免费观看_亚洲丰满少妇自慰呻吟_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;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 元江| 赤水市| 翁牛特旗| 绍兴市| 四会市| 银川市| 周至县| 北宁市| 淳化县| 广宗县| 揭西县| 丰镇市| 崇仁县| 讷河市| 巴南区| 方城县| 鄢陵县| 金乡县| 渭南市| 云浮市| 关岭| 霍邱县| 盐源县| 濉溪县| 昌宁县| 南投县| 永川市| 招远市| 祥云县| 华亭县| 新田县| 那坡县| 高州市| 中方县| 义马市| 芦山县| 明水县| 壤塘县| 凤凰县| 建始县| 乐平市|