boost是極有才華的程式設計師們編寫的c++庫。boost中的程式設計技巧、對c++及泛型的使用方式、以及其最終實現的效果都令人吃驚,甚至嘆為觀止。c++是強型別語言,有嚴格的型別檢查。而boost使用c++實現了弱型別的效果,著實在c++的牆上打了乙個洞。
c+ +的強型別特徵曾被視為一種優點。至今它仍然也是優點。嚴格的型別檢查可以幫助程式設計師檢測出**中的錯誤,可以提醒程式設計師注意到資料的取值範圍,可以規範程式設計師對變數的使用,並在一定程度上增加程式的易讀性。可以說c++編譯器對資料型別的檢查築起了一堵型別高牆,對變數任何錯誤的賦值、錯誤的使用都會被擋住,任何可能會出錯的地方都會被提醒。比如下面的**,在編譯的時候是通不過的。
int i;
i = "i am a string!";
這堵牆被築在了編譯器上,而在這堵牆之後,在程式的執行期,則幾乎完全沒有型別檢查。不僅如此,型別資訊似乎已經被拋棄了。程式不能在執行期得到資料的型別資訊,因此也無法在執行期依據型別選擇相應的操作。
比如在c++中就實現不了像下面這樣的語句:
void * makeplace( para)
在模板被引入之前,c++中只能用函式過載來增加可讀性。使多個型別的記憶體分配功能都使用makeplace這個函式名,如:
void * makeplace (int para)
void * makeplace (float para)
如果有很多態別,那麼就要寫很多個makeplace。這些makeplace函式都是相似的。這只是乙個簡單的例子,事實上,有很多演算法、結構都是可以應用到多種資料型別的,而為每種型別重寫一堆**,顯然麻煩的很。
後來c++增加了泛型特徵,可以在程式中使用模板。模板放在型別牆的前面,相當於乙個變身器。把乙個型別無關的演算法放進來,生成乙個符合型別法則的新演算法,然後再放過到牆的另一邊去。比如上面的makeplace**,可以寫成下面這樣:
template
void * makeplace(t para)
也許在c++中引入泛型模板只是為了這個樸素的目的,讓程式設計師少做些重複的工作。也許泛型標準的設計者當初認為這一點算不上型別牆上的裂縫,不會影響到c++的強型別特徵。呵呵,想想ie瀏覽器忙著封堵的那些漏洞吧。
這世上總會有一些智慧型讓你驚。boost就是這樣的東西。
boost沒有修改c++的任何規則。它是乙個完全符合c++規範的**庫。
但是看看這段**(摘自劉未鵬的文章:泛型指標類any之海納百川):
int i;
long j;
x x; //假設x為使用者定義的類
any anyval=i;
... //use anyval as a int value
anyval=j;
... //use anyval as a long value
anyval=x;
... //use anyval as a long value
噢。。。這是什麼,那個anyval是什麼型別的?any?它能除了int,long,x,還能賦值成別的型別麼?這是c++程式麼? 還是別的什麼東東?
any是boost的泛型指標,它確實可以賦值成任何型別。any其實是乙個類。但any確實可以是任何型別。但單純的any也什麼型別也不是。當它是c#中的var好了。
再看看下面這段**(摘自劉未鵬的文章:泛型指標類any之海納百川):
#include "boost/assign/std/vector.hpp"
using namespace boost::assign;
vector i_v;
i_v += 1,2,3,4,5;
看看上面**中最後一句的賦值語句。你真的還相信這是c++程式麼?這樣的**能通過編譯麼?在c++編譯器這堵牆還豎立在那裡的時候,boost能讓這些**順利穿過麼?
boost做到了!
事實上boost實現的效果遠不止文中描述的這些。boost的源**似乎也高於我的智慧型,以至於我仍沒有完全弄清楚它是怎麼實現的,只能以後慢慢研究了。
c++的型別檢查、語法規範等都很嚴格。它們像牆一樣保護了c++程式的安全,並嚴格限制了c++的**。boost是使用c++編寫的庫,符合c++規範卻讓弱型別操作和奇怪的語句順利穿過了這些牆。我覺得boost不只是在發展c++,也是在c++自己的牆上打洞。
Boost在C 自己的牆上打洞
boost是極有才華的程式設計師們編寫的c 庫。boost中的程式設計技巧 對c 及泛型的使用方式 以及其最終實現的效果都令人吃驚,甚至嘆為觀止。c 是強型別語言,有嚴格的型別檢查。而boost使用c 實現了弱型別的效果,著實在c 的牆上打了乙個洞。c 的強型別特徵曾被視為一種優點。至今它仍然也是優...
C 的UDP打洞試驗
公共 使用者類 public class user 使用者位址屬性 public endpoint location 返回乙個使用者例項 使用者名稱 使用者位址 public user string name,endpoint location 客戶端程式 using system using sy...
boost庫在ubuntu下的安裝
系統是ubuntu虛擬機器,安裝的是boost 1 60 0。2 進入到自己的目錄,解壓 bzip2 d boost 1 60 0.tar.bz2 tar xvf boost 1 60 0.tar 3 之後進入boost目錄 cd boost 1 60 0 bootstrap.sh之後會產生bjam...