Boost 實用工具
健康快樂地成長
Boost庫中有很多有用的小工具罐氨。說它們小假残,是因為它們實現(xiàn)的功能比較單純躯肌,代碼也都比較簡單者春,在實際產(chǎn)品代碼中也往往處于不起眼的角落之中。但是十分有用清女,最近學(xué)習(xí)完钱烟,總結(jié)出來跟大家一起學(xué)習(xí)
noncopyable
下面我們就看看如何自己和使用boost
庫實現(xiàn)一個禁止拷貝的類;
-
自己動手實現(xiàn)
一個很經(jīng)典的C++慣用法嫡丙,其原理很好理解拴袭,只需要“私有化”拷貝構(gòu)造函數(shù)和拷貝賦值操作符
struct no_copy { private: no_copy(const no_copy&); no_copy& operator=(const no_copy&); };
C++11后,一般使用下面的做法
struct no_copy { no_copy(const no_copy&) = delete; no_copy& operator=(const no_copy&) = delete; };
但如果程序中有大量這樣的類曙博,重復(fù)這樣的代碼是相當(dāng)乏味的拥刻,而且代碼出現(xiàn)的次數(shù)越多,錯誤可能性更大父泳;
-
怎么利用boost庫實現(xiàn)
使用boost::noncopyable
其實很簡單般哼,只需要繼承noncopyable
即可struct no_copy : boost::noncopyable { };
如果有其他人誤寫了代碼,拷貝構(gòu)造或賦值這個對象惠窄,那么將不能通過編譯器的檢查:
nocopy x; nocopy y(x); // error: 禁止調(diào)用拷貝構(gòu)造函數(shù) nocopy z; x = y; // error: 禁止調(diào)用拷貝賦值運算
-
頭文件位置
noncopyable
位于boost
命名空間下蒸眠,使用時只需要包含下面這個文件就可以了#include <boost/noncopyable.hpp>
-
boost庫的實現(xiàn)
struct base_token{}; class noncopyable: base_token { protected: noncopyable() {} ~noncopyable() {} private: // emphasize the following members are private noncopyable( const noncopyable& ); noncopyable& operator=( const noncopyable& ); };
因此,當(dāng)我們繼承
noncopyable
類時杆融,就會自動私有化父類noncopyable
的拷貝構(gòu)造函數(shù)楞卡,從而禁止用戶從外部訪問拷貝構(gòu)造函數(shù)和拷貝賦值函數(shù);
另外一種使用=default
和=delete
的用法就不給大家列舉了脾歇。 -
題外話
看到這里的小伙伴可能會說了蒋腮,boost
實現(xiàn)很簡單,我可以自己實現(xiàn)一份介劫,或者把boost
的代碼抄過來徽惋,是的這么做確實沒有問題;但是座韵,我個人的意見是不要造輪子险绘,不要重復(fù)造輪子,對于造輪子我個人的態(tài)度是:“非不能也誉碴,實不為也”宦棺。我們要會造輪子,但是我們不去造它黔帕。
optional
- 未完待續(xù)