0600部隊起床!

broken-social-scene-matias-palacios-hardy

我們是46T-RDSS 在離開成功嶺後各自到不同公司發展。會在此不定期分享各位在職場上遇到鳥事, 幹事 以及專業知識 領域跨足
資訊,網通,PM,製成,封測,會計

c++ 技巧:將member assign 給 std::function

最近工作上遇到個問題剛好stack overflow 上的這位老兄也有遇到,故事是這漾的。假設我想將一個class 內的member assign 給 std::function 如下:

class a
{
    public:
      void foo(){...}
      void b
      {
          std::function<void(void)> f = &a::foo;
      }
};

此時compiler 應該會報出一個關於參數的錯誤。

這個問題主要是因為 “non-static” member function 在 call 的時候必須搭配object 。而 “this” 為一個隱藏的參數。目光回到剛剛那個問題,std::function 宣告時我們明確告訴他 foo 是一個 “input 為 void 且 output 也是 void” 的 function。但 foo 確實是有個input parameter “this”。

為了解決這個問題,可以使用bind來解決。


std::function<void(void)> f = std::bind(&a::foo, this);

表示說call f 時候會去call a::foo 且第一個參數為this。如此就可解決問題

倘若foo 是有帶參數的呢?譬如:


int foo (int a, int b) {...}

那 bind 借必須調整一下:


std::function<int(int,int)> f = std::bind(&a::foo, this, std::placeholder::_1, std::placeholder::_2)

表示call f 時會去call a::foo 且第一個參數為this,第二個參數是f 的第一個參數,第三個參數是f 的第二個參數。

6/4~6/9 首爾&釜山自由行

韓國交通相當方便,許多觀光景點或是店家也都有會中文或英文的服務人員,所以就算是自由行新手也能輕鬆上手XD

這次和大家分享首爾&釜山6日自由行行程和注意事項~

★行前的準備和注意主要包含:
(1)Wi-Fi租借:這次自由行是租借i-video的LGU+(收訊頂級版)4G LTE上網吃到飽
租金計算是第一天490元,第二天起98元(平日)/196元(假日)
有多種取件和還件方式,請考量自己的航班時間再作選擇,避免多花冤枉錢或是陷入來不及取件的窘境。
i-video的FB官網會不定時推出優惠活動,或是刷特定銀行信用卡可以打8折唷! 這次是使用富邦信用卡打8折,所以我和我的同行夥伴共4人,平均每人每天的網路費(吃到飽)只要40元!!! 而且四人同時使用也不會卡卡的~ 不過Wi-Fi機頗耗電,建議攜帶行動電源~

(2)旅遊書:不是必需品,但是我有帶小梨的”首爾就該這樣慢慢玩“,這次在首爾的行程幾乎都有被包含在裡面,書中的路線說明也很清楚,非常實用~

3

(3)轉接頭、牙刷
韓國的插頭是用下面這種,上方是圓柱~ 另外,有些民宿不會附牙刷,最好自己先準備~
1
(4)列印機場巴士公車折價卷:搭乘機場巴士可以使用折價券喔,機場巴士的費用是KRW10,000,如果使用折價券,就在上車時將準備好的KRW 9,000及折價卷拿出來,司機會收走折價券,並請你將KRW 9,000投入錢箱。因為司機會將折價券收走,所以如果往返機場都是搭乘巴士就要事先準備2張折價券~

雖然搭乘巴士費用較地鐵高,但是不用拖著爆多的行李在地鐵轉乘,且司機會幫忙搬運行李,所以推薦大家回程可以搭乘巴士喔~

2

(5)換錢:出發前換了美金及少許韓圜,因為主要是帶美金到明洞換韓圜,所以在台灣只先換了50,000的韓圜,應付從機場搭到明洞的地鐵車費~

這次換匯是使用線上換匯(兆豐),方便又不需要手續費~按下網頁上方的”我要申購”,照著指示操作即可~

(6)地鐵轉乘/費用資訊:可以查詢地鐵費用及轉乘點,直接在圖上先點選出發站,再點選終點站,即會顯示資訊。但此為網頁版,手機無法使用喔。

(7)行程規劃地圖推薦:這次自由行規劃多虧有韓巢,中文介面而且超級詳盡

 

★6/4(六)~6/9(四)行程

第一天(6/4)
長榮BR170 7:30出發✈->11:00抵達仁川機場->民宿COMO明洞店放行李->(中餐)Isaac明洞店->弘大(自由市集)->(晚餐)陳玉華一隻雞(東大門店)->汗蒸幕sparex

這次是從二航廈出發,所以受人所託買Jo Malone,左邊是幫人家買的”鼠尾草與海鹽”,有股奶油味XD
在櫃姐推薦下,我也入手了人生第一支香水XD 就是右邊的”英國梨與小蒼蘭”,櫃姐說這是第一名款,一開始試香還不懂他的迷人之處,但反覆體會之後,深深愛上這迷人的漫浪氣息阿!!!❤❤❤

100ml 3,930元 / 30ml 1,970元

IMAG2057

✈抵達仁川機場,入境出口左手邊也有提供換匯的服務,只是匯率會比較差一點。

5

入境後,跟著”Airport Railroad”指示牌走就可以抵達機場鐵路A’REX搭車處,A’REX其實就是首爾地鐵的機場線,只是這個機場線依速度及價格分為一般列車直達列車

4

一般列車(Commuter Train):直接使用T-money刷卡進入,就像臺灣的捷運一樣~以仁川機場至首爾站為例,票價是KRW4,150,乘車時間約53分鐘。
直達列車(Express Train):必須購票劃位,以仁川機場至首爾站為例,票價是KRW8,000,乘車時間約43分鐘。

兩種列車搭乘時間只差10 分鐘,小資女孩當然是選便宜的XD,T-money卡可以在從入境走至A’REX乘車處路上的便利商店購買,空卡一張KRW 2,500,之後再到A’REX乘車處儲值。自動儲值機都會有中文介面,不用擔心~

我們住的民宿在明洞站,所以搭乘A’REX到首爾站(機場線的終點站),換乘地鐵4號線至明洞。韓國地鐵每一站都會有編號,例如明洞編號是424,第一碼4代表的就是4號線。

民宿是一間連鎖民宿Hotel Tong,在明洞、東大門、仁寺洞等都有分店,FB上會有優惠資訊,訂房時可以注意一下~這次住的明洞民宿COMO,四人房表定價格每晚是KRW11,000,FB網友預約享9折優惠。因為這間民宿不需事先預付訂金,所以入住前幾天會再以Line或email的方式和你確認是否會如期入住。櫃臺會說中文,房間很乾淨,有附土司早餐,缺點是沒有電梯,房間有點小,但是小確幸是從5樓的花園可以看到很清楚的首爾塔

放完行李後,就開始6天5夜的瘋狂自遊行拉,第一站先到Isaac 6 解決午餐,有中文菜單,我點了烤肉MVP吐司KRW2,800+奇異果汁KRW2,500。奶油及美乃滋的香味加上烤肉,跟果汁真是絕配。   8

填飽肚子後,就是先去換韓圜囉,準備大花特花~明洞匯率較好的換錢所就是眾所皆知的一品香(在B1)和大使館。就在Isaac旁邊CU便利商店轉進去的那條路上。

10

第二站來到弘大,也就是弘益大學的商圈,星期六還有自由市場(創意市集)可以逛~

 

明洞站搭乘4號線,至首爾站轉乘機場線至弘益大學站,從9號出口出站,逛到自由市場回到地鐵站。

11

因為晚上要去東大門汗蒸幕sparex,所以晚餐就吃附近的陳玉華一隻雞。

搭乘地鐵至東大門站,9號出口出站,詳細的路線可以參考小梨的網誌

12

從9號出口出站時,回頭就是東大門! 原來東大門真的是一個門XDD

13

陳玉華一隻雞真的是此趟自由行美食的第一名 要我吃一百次都行!!!

14

一隻雞KRW20,000,大概是2個人吃的份量,裡面還有些馬鈴薯。可以加點年糕或是麵條。旁邊有泡菜可以自取,隔壁桌坐的是韓國人,看到我們傻傻坐在那邊等鍋滾,就叫我們去拿泡菜來加比較好吃XD 這雞湯看似簡單,但喝起來真是不簡單阿,清爽但有股蒜味,真是我的大愛! ❤

15

吃飽之後就準備去體驗汗蒸幕囉~以下是我們從陳玉華一隻雞走到sparex的路線。也可以搭地鐵到東大門歷史文化公園站14號出口。sparex在一個叫做”Good Morning City”商場的B3(大樓進去後左轉有電梯)。

16

晚上8點前入場比較便宜,KRW8,000。付完錢之後,櫃台會給你一套衣服、兩條毛巾和一把鎖匙,上面的號碼就是鞋櫃和衣櫃的編號。

17

第一次去汗蒸幕的朋友可能都會有點不知所措,簡單來介紹一下,在鞋櫃放好鞋子後,往裡邊走就會分成男生區及女生區,一進去會有阿珠瑪販賣簡易的沐浴用品及免洗內褲。接著,就去找自己的衣櫃,將身上的衣服和剛剛櫃台給的乾淨衣服一起放進衣櫃裡,沒錯,就是全裸拿著毛巾及沐浴用品就可以去洗澡嚕~洗完澡還可以泡泡湯♨ 洗完澡再回到衣櫃穿上乾淨的衣服。現場有提供吹風機(10分鐘 KRW200)、棉花棒和乳液。再來就是韓劇裡常出現的場景拉~包著山羊頭,躺在地板上放空~~~
烤蛋、煙燻蛋、煮泡麵等等超多食物,不用擔心在這邊玩太晚肚子餓。而且這裡是24小時營業,所以根本可以在這邊過夜!!!還看到很多一家子或是情侶在約會XD

回民宿的時候還經過東大門設計廣場,這棟超現代建築晚上點了燈無疑是浪漫的約會勝地阿 ღ

 

 

第二天(6/5)
北村八景->(午餐)三清洞吃休錢走起司年糕鍋->仁寺洞(穿韓服20分)->景福宮->(晚餐)土俗村蔘雞湯->(夜景)光化門廣場、清溪川->樂天超市(首爾站)

 

第三天(6/6)
江村鐵道自行車->南怡島->(午餐)搖搖便當->(晚餐)姜虎東白丁明洞店->明洞夜逛

我們是先在kkday購票,一天有10個班次,分成雙人票及四人票。

鐵道整個行程大致是:鐵道自行車->休息站->列車->終點站->搭接駁車回起點

南怡島搭船進入是KRW8,000(外國人票價,需出示護照),包含南怡島門票及來回船票。

搭船進入南怡島大概只要10分鐘,船上插滿各國旗幟,真的就像聯合國~

午餐的搖搖便當很搞笑,必須戴上防燙手套,拿著鐵盒便當上下左右搖晃。

 

 

 

 

第四天(6/7)
8:30搭KTX至釜山->民宿放行李->(午餐)錦繡河豚->海雲台->龍山頭公園、釜山塔->check in Busan 咖啡廳->(晚餐)豆田裡嫩豆腐->樂天 Sky Park

 

糖餅KRW1,200,真是驚為天人!!! 好想再吃100個,但覺得熱量實在太高惹XD

第五天(6/8)
豬肉湯飯->釜山站(寄放行李)->甘川文化村->(中餐)巨人炸雞->南浦洞->17:25KTX回首爾->民宿COMO仁寺洞店->(晚餐)青春街路邊小吃

 

黑輪條(附湯)、紫菜飯捲包蛋、辣醬血腸

 

第六天(6/9)
(早餐)Iassc梨大店->梨花梨子大學->梨大商圈->(午餐)新村八色烤肉->回民宿取行李-搭機場巴士6002->長榮BR150 19:45起飛->21:20抵達桃園機場

在梨大站搭乘手扶梯出站的時候看到每個女生人手一本筆記,就知道今天應該是期末考拉XD

大約9點半抵達Iassc梨大店,這間分店是有提供位子的喔,而且這間餐點的選擇比明洞店多~烤肉MVP實在太好吃,所以又點了一次,不過這次飲料是搭配黑咖啡,完美的早餐開啟我在韓國自由行的最後一天✌

梨花女子大學美得不像話,建築兼具歐洲風格與現代感。

 

梨大商圈也是一個讓人失心瘋的地方,在這買了1件洋裝和1件上衣。

梨大現在也有換錢所,雖然匯率可能沒有比明洞好,但是失心瘋買到沒韓圜的時候還是可以先應急~
這間換錢所也有提供行李寄放的服務,早上9點開始營業,價格似乎是5個小時KRW3,000的樣子。

3點回到仁寺洞民宿取行李,搭乘機場巴士6002到仁川機場,機場巴士的候車站牌上方會有飛機圖案,所以很顯眼,不用擔心找不到,每15~20分鐘一班。我們上站的地點是鐘路2街,從這邊搭到仁川機場大約1個小時20分鐘。

★在Tax Free店家消費3萬元以上可以退稅,現在已經有店家可以直接在店裡退稅(例如innisfree、LANEIGE、樂天超市等),但是部分店家是在你結帳的時候,告訴他你要退稅,他會印退稅的單子給你,拿著單子到機場辦理退稅。

★在機場辦理退稅十分簡單而且快速,步驟:

(1)辦理check in,地勤會問你退稅的金額是否有超過KRW75,000(注意是退稅金額,不是消費金額喔),如果沒有超過他會直接幫你掛行李,你不用拖著行裡去辦理退稅。

(2)到櫃臺D區或J區使用退稅登錄機器,有繁體中文介面。先掃描護照,再掃描退稅單的條碼。

(3)出關檢查後至Gate24或Gate41的機器領取現金。

 

沒想到失心瘋的最後一站會是仁川機場!!!

幫我弟買了Samsonite Red 的後背包,臺灣價格6,300,這裡只要USD100!!!立馬手刀付錢。還有一直注意很久的GUCCI太陽眼鏡,臺灣價格7,200,仁川機場是USD213,一樣速速打包回家!
終於在機場買到可愛的星巴克杯杯了,不知道為什麼首爾和釜山的星巴克都只有賣韓文的文字杯@@ 而且這裡的杯杯也太便宜了吧,KRW13,000而已,換算台幣約360而已,比大陸的星巴克杯動輒5、6百元便宜好多阿!
手邊還剩下一些韓圜,買了一個釜山磁鐵,好Q~
接近登機時間,只好不捨得向登機門前進,結果居然在登機口買到了Kitty造型杯的飲料~完美的ending!✵

Polymorphic cloning and the CRTP

許久沒有更新文章了~ 來分享一個最近學到的design pattern!

(全文參考:C++: Polymorphic cloning and the CRTP

在c++ coding 時,常會遇到一個問題如下:

class Vehicle {}
 
class Car : public Vehicle {}
class Plane : public Vehicle {}
class Train : public Vehicle {}

如果我想替這些人寫一個共用的 “clone(複製)” function 時該怎麼做呢?
我可以這樣寫:

Vehicle* make_a_copy(Vehicle *v)
{
  Vehicle *copy_of_vehicle = new ????(*v);
}

但這麼做會有個問題,???該填什麼? 他應該要隨著我要複製 Car Plane Train 等物件而跟著改變,而非寫死的。因此呢先有了第一種design pattern : polymorphic cloning pattern 我們直接來看code:

#include<iostream>
using namespace std;

class Vehicle
{
public:
    virtual ~Vehicle () {}
    virtual Vehicle *clone() const = 0;
    virtual void show()
    {
        cout<<"Vehicle show "<<endl;
    }   
};

class Car : public Vehicle
{
public:
    int a;
    virtual Car *clone() const { return new Car(*this); }
    virtual void show()
    {   
        cout<<"Car show"<<endl; 
    } 
}; 

int main() 
{ 
    Car* car_ptr = new Car(); car_ptr->a = 100;

    Car* car_ptr2 = car_ptr->clone();
    car_ptr2->show();
    cout<<"car_ptr2-> = "<<car_ptr2->a<<endl; 

    delete car_ptr; 
    car_ptr2->show();
    cout<<"car_ptr2->a = "<<car_ptr2->a<<endl;
       
}

result:

Car show
car_ptr2->a = 100
Car show
car_ptr2->a = 100

主要概念是每個物件要實現自己的clone function,且它主要是依靠 “copy constructor” 在運作。 code 解析如下:
1. class 中function 都有virtual 的前綴,表示希望等下可以支援 “多型”
2. function 結尾還有const = 0 表示要求繼承他的人要自己實作,否則compiler 會抱怨。
3. 一旦call 了 Car 的 clone 他會把 “自己丟到自己的copy constructor”,製造出一個自己的副本,並用一根pointer 指向它,並回傳該指標。
4. 為什麼可以用base class 型別的 pointer 去指向 derived class 的物件?這個一樣去參考 “多型” 的概念。

main function 裡頭做了一些測試,首先我先new 了一台car,並對member付值,接著我再create 一個car2 但是用clone的方式複製一台car 給car2,為了證明真的複製成功我把car2的member a 印出來看,真的有如期拿到100。 但會不會是個物件被兩個ptr 指著呢。為了測試我們把car_ptr 先給delete 掉,再一次的print 出car_ptr2 還是可以拿到預期得值。以上clone 的寫法就是polymorphic cloning pattern 。

接下來就是進階版的CRTP了:

所謂的CRTP指的是某個class繼承一個template class 且該teamplte 的type 又是自己,像下面這樣:

class SomeClass : public MyTemplateClass<SomeClass>

這跟我們今天的例子有甚麼關係呢?

假設我們覺得每個繼承Vehicle的人都樣實作clone很麻煩,能不能把clone function 給抽出來放到base class 呢? 當然是可以的,但須將原本的vehicle 給包一層皮,寫法如下:

class Vehicle
{
public:
    virtual ~Vehicle() {}
 
    virtual Vehicle *clone() const = 0;
 
    virtual void describe() const = 0;
};
 
template <typename Derived>
class VehicleCloneable : public Vehicle
{
public:
    virtual Vehicle *clone() const
    {
        return new Derived(static_cast<Derived const &>(*this));
    }
};

利用VehicleCloneable去繼承Vehicle 然後實現特別的clone function,值得注意的是:

static_cast<Derived const &>(*this)

這句話。如果我們沒有做轉型,this指標所指的type 是 “VehicleCloneable ” ,會造成錯誤。

有了這樣的結構後car plane 等人就可以直接繼承VehicleCloneable 拉~

class Car : public VehicleCloneable<Car>
{
public:
    virtual void describe() const
    {
        std::cout << "I am a car" << std::endl;
    }
};
 
class Plane : public VehicleCloneable<Plane>
{
public:
    virtual void describe() const
    {
        std::cout << "I am a plane" << std::endl;
    }
};

clone 的方式跟上方的範例一樣,只不過clone 的實作改由vehicle 來實現。