2014年9月7日 星期日

Effective Modern C++ 筆記:Type Deduction 規則

一邊讀《Effective Modern C++》一邊作筆記 = =||
太複雜了,一定會忘記

C++ 總共有三種 Type Deduction

I. template argument deduction


template < typename >
void f(ParamType param);
f(expr); // 從 expr 推導 T 跟 Param

template argument deduction 有三種 case

1. ParamType 是 pointer 或 ref,但不是 universal ref

  • 如果 expr 是 ref,把 ref 拿掉
  • pattern-match,導出  ParamType

2. ParamType 是 universal ref(就是有 && 的形式)

  • 如果 expr 是 lvalue,那 T  ParamType 都導成 lvalue ref
  • 如果 expr 是 rvalue,那就跟平常一樣(平常一樣是啥?)

3. ParamType 不是 pointer 也不是 ref

  • 如果 expr 是 ref,把 ref 拿掉
  • ref 拿掉之後,如果 expr 是 const/volatile,也拿掉
另外,array 跟 function 會退化成 pointer


II.  auto  deduction

跟 template argument deduction 幾乎一樣,除了初始化的時候對待  {...}  不一樣, auto  會把  {...}  推導成  std::initializer_list ,但 template argument 無法推導  {...} 

auto a = {1, 2, 3};  // a 是 std::initializer_list
f({1, 2, 3});        // 編譯失敗,無法推導 T

III.  decltype  deduction

什麼就是什麼

const int a = 7; // decltype(a) 就是 const int
const int& b = a; // decltype(b) 就是 const int&

 decltype  最常用來作的,就是用來傳遞「原原本本的型態」,比方說你有一個 wrapper function,需要 perfect forward,然後 return value 的型別也要一五一十的反應出來,那你的好朋友就是  decltype

template < typename F, typename ... Args >
auto func_timer(F&& f, Args&& ... args)
-> decltype(f(std::forward(args)...))
{
    auto begin = time();
    decltype(f(std::forward(args)...)) result = f(std::forward(args)...);
    std::cout << time() - begin << std::endl;
    return result;
}

func_timer(foo, 1, 2, 3);

因為  foo  的 return value 有可能是 reference,人家有可能寫

func_timer(foo, 1, 2, 3) = bar;

所以連 referenceness 也要保留,所以要用  decltype 。但那一大長串實在太麻煩,所以 C++14 提供  decltype(auto) ,讓你可以簡單

template < typename F, typename ... Args >
decltype(auto) func_timer(F&& f, Args&& ... args) {
    auto begin = time();
    decltype(auto) result = f(std::forward(args)...);
    std::cout << time() - begin << std::endl;
    return result;
}

喔,使用  decltype(auto)  的時候還有一個特例要記住。 decltype(auto)  有兩條規則:
1. 如果遇到單單一個 name 的 lvalue expression, decltype(auto)  就是那個 name 的型別
2. 如果不是單單一個 name 的 lvalue expression, decltype(auto)  帶有 ref

decltype(auto) f1() {
    int x = 0;
    return x;     // decltype(auto) 是 int,所以 f() 也是 int
}

decltype(auto) f1() {
    int x = 0;
    return (x);   // decltype(auto) 是 int&,所以 f() 也是 int&
}

2014/09/09 更新


因為有讀書有學到新東西,又感覺已經很久沒寫一些比較深的 C++ 了,所以中秋節剛好來自幹一個 variant (github repo)

2014年8月26日 星期二

我是「媽寶級白目」

突然發現自己不知道從什麼時候開始,
已經變成所謂一直發政治文的「政治魔人」了……

還記得以前覺得政治很無聊、很髒、不該碰……
覺得會去看政論節目的人腦袋都有問題……

從學校畢業以後進入業界,
然後發現這個業界有著很病態的超時工作文化,
雖然我自己沒遭到壓榨,但我開始注意勞工權益,
參加了電子電機資訊工會,然後開始慢慢了解「爭取」是什麼。

然後第一次去了抗議現場,
發現即使我們工會人不多,
但每次活動總有很多其他的社運團體會來支援我們。

然後第一次去了遊行活動,
然後才知道原來早就有很多人已經在街頭上努力了這麼久,
然後知道我們也應該在別的活動去支援別人。
然後知道在這個支援別人的過程,
我們也了解了別人所面臨的,別的社會議題。

然後慢慢知道了一些歷史課本不會寫的東西,
然後慢慢知道了一些新聞媒體不會報的東西,
然後真正體會了當初曾華璧老師在課堂上講的東西。
然後突然之間,那是一個相變的過程,很快速,
我的想法在很短的時間裡面蛻變的很快。
我想那也許就是「公民覺醒」。

我還記得以前有一次看到李敖在電視上說:

  一個真正民主的國家,投票率不會太高,
  如果投票率很高,代表政治對人民生活的影響非常大,
  『我支持的候選人沒上,我要去自殺!』這是不對的!
  民主社會的話,誰當選,對百姓的生活都不應該差太多,
  如果一個社會裡面『誰當選』差很多的話,
  那這個社會就不民主。

當時我的想法是:

  說的真好,那些對政治很投入的人真是白痴,
  台灣就是因為有你們這些人,才顯得台灣不民主。

現在想想當時真是愚蠢的不可思議。
不是因為他們的投入,才顯得台灣的不民主,
而是因為台灣不民主,害得他們不得不投入。

想到讀 Game Theory 講選舉的時候,裡面提到兩種模型,
一種是候選人可以選擇要提出什麼政見的模型,
一種是候選人無法選擇要提出什麼政見的模型。
第二種是因為政見不一定會履行,候選人完全可以胡說亂騙,
所以他的政見應該是他過去作了什麼,不是現在說了什麼。
而理智的公民是有記憶的,我們會記得你過去的為人處事,
所以實際上,候選人無須提出政見,
我們看你過去作了什麼,就知道你未來想幹麻。

兩種模型當然都跟現實有些距離,但還是很有啟發性,
特別是第二種,實質是遠比第一種好的多,
現實若偏向第一種,代表選民都是健忘的,
現實若偏向第二種,而候選人就無法欺瞞選民。
但要作到第二種的前提,是選民必須要長期的關注政治,
知道那些人到底在幹麻,而不是等到快要選舉的時候,
才看看選舉公報、甚至不看選舉公報就投票了。

如果是這種狀況,
那那些選民不過就是四年投一次票政治植物人罷了,
他們根本不會思考,也沒有記憶,
他們有民主的權利,卻沒有民主的能力。
他們胡亂的投票,結果卻是大家一起背負的。
讓所有人一起承擔選出惡劣候選人的責任。

這是不對的。

所以,如果你有投票權,
那麼,關注政治,就是你的社會責任。
因為你的那一票會影響別人,
放空亂投,是讓別人在背負你本來應該背負的責任。

請面對這個事實:「台灣,不是一個民主國家」,
選錯人,很嚴重,請關注政治,負起你的社會責任。

「太辛苦了,而且很沈重」你說

所以大家要看我的臉書。

每天都有又酸、又靠北、又北七的苦中作樂政治文,
把沈重跟嚴肅寄託在低能跟歡樂當中,
我發現我的文章越來越像國寶級白目了,
我真的有夠白目,不過我不到國寶等級,那就媽寶好了,
以後請大家叫我「媽寶級白目」。

2014年5月2日 星期五

幫 BBS client 加上黑名單的功能

一開始嘗試從 PCMan 下手去改,但遇到幾個問題:
  1. PCMan 要 MFC,MFC 要錢,我沒有 MFC
  2. PCMan 的 code 有點難懂,看不懂很懂 Q_Q
  3. PCMan 只能在 windows 上面
於是放棄。

接著嘗試 PCManX,但發現 windows 上面要跑 GTK+ 也有點麻煩 >"<~
放棄。

然後嘗試自己從頭手動打造,為了跨平台,決定用 Qt,就開始動手,寫著寫著,突然想到「不對,應該有人作過同樣的事情…」於是再繼續 survey,發現果然有個叫做 Qelly 的 telnet client,看了一下 code,用 Qt,有 open source 放在 github 上面!程式碼品質也不錯,似乎不難修改。於是就開始動手 :P

弄了 24 小時以後,有一點初步的結果 XD

目前可以在「文章選單」跟「串接」的時候把特定作者的文章抹黑,但「文章內容」還沒辦法過濾,這樣就沒辦法在用 =, [, ] 瀏覽文章的時候時候過濾文章。希望這個週末可以完成

2014年3月19日 星期三

3/18深夜 ~ 3/19早晨服貿立法院公民運動第一線經歷

3/18 夜晚,已經要上床睡覺了,收到朋友的消息說立法院有事。上網看了一下,氣到睡不著,3/19 一點半,決定衝去現場。

零、地圖

一、初到現場,濟南路

停好車,走了一段路,聽到有人在喊話,我猜是現場,走過去,看到很多人。坐下來聽了快半個小時,不知道自己來幹嘛的,就有點想要走了,因為還要上班。這時候突然聽到募集「要找五十個人去青島東路支援」。我想說好吧,好歹有個目標,就趕快舉手跑去,結果發現帶隊的人是黃國昌耶!我因為跑很快,所以就在他正後方,一直跟著他走,聽他聲音,他嗓子已經完全啞了。

二、主戰場,青島東路

到了之後,發現很多人都在馬路上坐著,一樣是聽講話,聽聽聽聽聽聽聽,過程一直強調「警察不動,我們不動」但警察如果動了,我們就會行動,一直聽,聽了差不多一兩個小時,快四點吧,一直被蚊子咬,我又想要回家了,就一邊按耐住蚊子咬,一邊睡覺,睡著睡著……突然聽到「警察攻堅了!

「警察不動,我們不動!現在警察動了,我們要不要去救我們的夥伴?」
「要!」
「好,大家翻過去。」

幹!頓時睡意全消!包包往背上一甩,三兩步就跳上去,因為我的位置就在牆邊,翻牆進去的很早,一下就衝到最前線!被警察擋住,但警察因為被我們衝,所以也放棄攻堅了,我們就 hold 住。 但這個時候還沒衝到樓梯上。樓梯是警察的地盤。樓梯下面被警察團團圍住。就坐下來開始睡覺,這個時候已經不想走了,決定呆到天亮。

睡著睡著,又聽到「警察拖人了!」

看過去,從窗戶看到裡面警察正在拖人,一個小女生被一群警察抓住!動作很大,他媽的很粗暴,而且因為就在窗邊,看得很清楚,女生往窗戶邊掙扎,一直想要掙脫,但是被警察抓住!這時候窗戶邊的民眾衝上去也把警察抓住!兩邊拉扯很久!現場超級火爆的!非常吵鬧!那時候所有的聲音都混在一起!不時可以聽到「警察打人了!!」然後就會聽到更多的怒吼聲,非常可怕。透過窗戶可以看到裡面的警察不時有拖人的動作,好幾個人被抓。

後來警察又幹了一件很蠢的事「把窗簾拉上」才拉一半,就被人發現

「警察拉窗簾!!」
「拉個屁阿!怕人看嗎!!」

結果警察也隔著窗戶跟民眾對罵!立刻有人衝上去把窗簾抓住,不讓警察關上,警察也把窗簾抓住!結果整條窗簾被扯下來,看光光了。

結果過沒多久,警察又攻堅了,幹!馬上爬起來!衝!警察被沖退!退到門口裡面樓梯被我們攻下來了,但進不了門。

這時候開始就隨時都很緊張,根本無法休息,警察一直有動作,一直有動作,每次警察有動作,我們就往裡面擠,但裡面警察密度太高,根本擠不進去

突然有人喊「把警察拉出來」
警察一聽到這句,立馬有反應「敢拉警察!我就抓人!」
看樣子警察真的會怕拉,不怕推。

但說要抓人這句,有嚇到人,嚇到大概安靜了一秒鐘吧

「抓就抓阿!」
「抓我阿!」
「抓我!我第一個!」
「我第一個!」
「把警察拉出來!!!!!!!!!」

大家衝上去拉了,天哪…門口那個警察一看,靠北,這些人不怕!立馬兩手兩腳撐住門框,結果大家就開始拉警察!警察後面兩個人抱住他,兩個人後面又好幾個抱住他們,就像是一串葡萄,然後你摘最下面的那一顆。

「拉!拉!拉!」結果就拉出一顆警察,然後警察就被接力的拖出去,就像滑板一路滑出去一樣。一片混亂當中還有人偷打警察,結果偷打警察的人也立馬被旁邊的人打! 「打什麼警察阿!人民是警察的保母!」

最後發現不管推拉都沒用,太難把警察清除了。且那時候警察已經停止攻堅了,黃國昌就叫大家冷靜,休息。

以上這樣衝突、休息重複了好幾次。不知不覺竟然已經七八點了。

黃國昌老師現場開了記者會,描述了訴求:

  1. 馬英九道歉、江宜樺下台
  2. 服貿退回
  3. 警察撤出立法院

三、中山南路,立法院正門口

然後我就離開準備去洗澡上班了,從青島東路,經過中山南路,準備要去牽車的時候,經過立法院大門口,看到門口也有警察跟民眾對峙。警察在立法院門口裡面,民眾在外面,看起來沒什麼事,很和平 我就繼續往前走,走過去之後,突然聽到很大聲的騷動。轉頭一看!幹!警察衝出來了!!好多!!好多!!!!!!!!兩群人直接衝撞在一起!!!!!!!

媽啦!衝上去再說!就跟拿盾牌的警察在那邊對衝!擠在第一排!死命的推!!!幹!可是警察人真的超多,力氣真的超大的!!被推的一直後推!我面前那個拿盾牌的,是一個蠻年輕的警察,臉色感覺已經很差了。我不管怎麼推都推不動,突然想到剛剛「用推的沒用」我就抓住他的盾牌,有幾個人也跟著我抓盾牌!那警察瞬間暴怒!整個眼神馬上改變,動作超大的!整個就是真的殺紅眼的眼神!抓住盾牌就大力往眼前的民眾身上揮,差點打到一個媽媽!我一看,他媽的!

我操你媽的你在幹嘛阿?你他媽的真的殺紅眼了阿?!
幹!你演演戲也就算了,你現在是他媽的真的要打人阿?!
你現在到底在幹嘛!?你在幹嘛!?你知不知道自己在幹嘛?!

我把他盾牌剝開,衝到他面前,只著他一直罵,罵到他好像有點龜了……
盾牌放下了……然後我們就衝上去繼續抓他的盾牌 = =

另外一個警察,盾牌一被另外一個人抓,立馬就「不准抓我的盾牌」超兇的!我一看到,就跑過去「怎樣!抓我逆?」然後就一起搶他盾牌,但都沒搶到 = =

後來持續對衝了幾分鐘以後,雙腳快軟掉了,我就想說「幹,我要回家洗澡上班了」就轉身離開。

才一轉身,手就被抓住,轉身一看,是一個女生,因為氣力放盡,累到臉都扭曲了。
一手推著警察的盾牌,一手抓住我:「你是男生…力氣大…」

……………幹!!!!!!!
只好轉過身再衝!!!!!!
又衝了不知道多久,警察停止推進了,我猜我的臉也跟女生剛剛一樣扭曲

終於可以回家了,結果忘記車停在哪,找了十五分鐘才找到,腳都快走不動了。

強烈建議大家一定要站到第一排搖滾區,體驗一下

感想

沒寫到感想?感想就是很想哭。

現場絕大部分的時間都很和平,但偶而會有非常火爆的場面出現。每次發生推擠的時候,我都很想哭,很生氣,氣為什麼同樣都是老百姓,卻要站在陣線的兩邊。

可以的話,民眾也想在這個時間躲在棉被裡面睡覺,而不是衝到這個地方,用盡全力的跟本來應該是保護自己的警察對峙跟衝撞。

可以的話,警察也想躲在家裡面睡覺,陪伴老婆跟孩子,而不是在死命的去把正在行使公民義務的學生拉出來,但又害怕傷害到任何人,而且如果被打還不能還手。

而真正該為這些事情負責的人,卻躲在棉被裡面睡覺,睡得很開心。

但為什麼民眾還是要站出去,因為如果我們不站出去,那些人永遠都可以作他們想做的事情且不用付出任何代價