Successfully reported this slideshow.

ajax_onlinemad

2,648 views

Published on

onlinemad

Published in: Technology
  • Be the first to comment

ajax_onlinemad

  1. 1. Visual C++ 2005 上開發 C++ 程式與 Boost Library 使用技巧 Birdman/ [email_address]
  2. 2. About Me <ul><li>邱銘彰 (Jeremy) , jeremy[AT]x-solve.com , jeremy.chiu[AT]msa.hinet.net </li></ul><ul><li>現職:艾克索夫公司資安顧問 </li></ul><ul><ul><li>目前為 Archon Scanner 分析引擎主要開發者。 </li></ul></ul><ul><ul><li>主要研究在領域在資訊安全與軟體設計方面,包含軟體行為分析、惡意程式偵測演算法與 IDS 系統、軟體工程架構等。另外對於 Spyware/Rootkit 、 Software Reversing 、 System Programming 等 Security 主題也有相當的研究。 </li></ul></ul><ul><li>學歷: </li></ul><ul><ul><li>大同大學資訊工程研究所博士班 (http://www.ttu.edu.tw/) </li></ul></ul><ul><ul><li>大同大學資訊工程研究所碩士 </li></ul></ul><ul><li>顧問與講課經驗: </li></ul><ul><ul><li>曾任資策會 BCB/Delphi 深入淺出 VCL 講師 </li></ul></ul><ul><ul><li>資安人雜誌特約專欄作家 </li></ul></ul><ul><ul><li>臺灣微軟、資策會、學術單位…等單位之特約顧問 / 講座 </li></ul></ul><ul><ul><li>2005 與 2006 台灣駭客年會 ( HIT)Keynote Speaker Column Writer (http://www.informationsecurity.com.tw) </li></ul></ul><ul><ul><li>MSDN Flush Writer (http://www.microsoft.com/taiwan/msdn) </li></ul></ul><ul><li>Blog : http://x-solve.com/blog </li></ul>
  3. 3. 前言 <ul><li>近年來新的 ISO C++ 標準發展地十分蓬勃,也遠遠超過了我們以前所熟知的範圍。而其中新的泛型程式技術思維更是徹底顛覆了傳統程式庫實作方式,如著名的 Boost Library 便是代表作之一,它不但將加入 C++ ,成為標準程式庫,也可以說是 C++ 的新里程碑! </li></ul><ul><li>在這個場次中,我們將介紹 Visual C++ 2005 上開發 C++ 程式與 Boost Library 使用技巧,讓各位瞭解到如何正確的使用 C++ 的特性,並能將舊有的程式改良提升到新的 Visual C++ 2005 中。 </li></ul>
  4. 4. Outline <ul><li>C++ 的美麗與哀愁 </li></ul><ul><li>你的新武器 Boost Library </li></ul><ul><li>Visual C++ 使用 Boost </li></ul><ul><li>第一次 Boost 親密接觸 </li></ul><ul><li>C++ 幻術 – Metaprogramming </li></ul><ul><li>總結 </li></ul>
  5. 5. 1. C++ 的美麗與哀愁 <ul><li>C++ 的近況 </li></ul><ul><ul><li>C++ 是個是歷史悠久的語言, Stroustrup 在 1979 年發明 C++ ,它是一種中立的、開放的、不依賴於任何平台的、也不被任何一家商業公司所操縱的語言,語言標準則是由 ISO C++ 標準委員會制訂。大量應用在各種領域,商業、科學或是系統程式方面。 </li></ul></ul><ul><ul><li>但是也可以說是新的語言, C++ 的 ISO 標準,直到 1998 年才制定完成 ! (ISO_C++_IEC_FDIS_14882) ,我們稱為 C++98 。 </li></ul></ul><ul><ul><li>這幾年來各種語言工具不斷的發光發熱,如 Java , VB , C# , Delphi ,還有 PHP 、 Ruby 、 Python.. 各種 Script 。而 C++ 的使用人口也一直無法增加,部分的資料或是工具也正在萎縮。 (CUJ 收攤了 ) </li></ul></ul><ul><ul><li>C++ 堅持在效率與 Static Type System ,選擇了一條自己的方向 – Generic Programming 。我們將繼續介紹下去… </li></ul></ul>
  6. 6. C++ 的特性 <ul><li>C++ 是種多重設計思維的語言 </li></ul><ul><ul><li>Procedural-based </li></ul></ul><ul><ul><li>Object-based </li></ul></ul><ul><ul><li>Object-oriented </li></ul></ul><ul><ul><li>Generic paradigm </li></ul></ul><ul><li>你可以簡單解釋這四種設計思維嗎 ? </li></ul>
  7. 7. 旅居地球的 C++ Masters <ul><li>下面幾位 C++ 大牛人,都有必讀的經典名作 </li></ul><ul><ul><li>你讀過幾本 ? :D </li></ul></ul>Nicolai M. Josuttis Daveed Vandevoorde David R. Musser Todd Veldhuizen Bjarne Stroustrup Stan Lippman Andrei Alexandrescu Scott Meyers Herb Sutter
  8. 8. C++ 與 Library <ul><li>Library 在 C++ 中是很重要的一部份,也是語言規範的一部份 </li></ul><ul><li>其他的程式庫 STL, Loki…MFC!? </li></ul><ul><ul><li>STL </li></ul></ul><ul><ul><li>Loki </li></ul></ul><ul><ul><li>ACE </li></ul></ul><ul><ul><li>我知你跟它有感情了,請你忘 MFC 吧 ! </li></ul></ul><ul><li>當你要完成一件工作時,你可以有這個順序 </li></ul><ul><ul><li>看看 STL 有沒有提供 </li></ul></ul><ul><ul><li>看看 Boost 有沒有提供 </li></ul></ul><ul><ul><li>看看自己用過的 Library 有沒有 </li></ul></ul><ul><ul><li>如果 C++ 語言本身,可以做就自己寫 </li></ul></ul><ul><ul><li>google 找 Open-Source Library 來抄 </li></ul></ul><ul><ul><li>花錢買 Library </li></ul></ul><ul><ul><li>報告班長,我失敗了 !! 請給我地獄般的逞罰 </li></ul></ul>
  9. 9. C++ 小測驗 <ul><li>C++ 是很複雜的語言 </li></ul><ul><ul><li>很多人學了數年的 C++ ,還是無法駕馭這神獸 ( 包含我 ) 。 </li></ul></ul><ul><ul><li>小小測驗 ( 請問這是什麼語言 ?) </li></ul></ul>template< int bit_size > struct integer { typedef mpl::list<char,short,int,long> builtins_; typedef typename mpl::base< typename mpl::lower_bound< mpl::transform_view< builtins_ , mpl::multiplies< mpl::sizeof_<_1>, mpl::int_<8> > > , mpl::int_<bit_size> >::type >::type iter_; typedef typename mpl::end<builtins_>::type last_; typedef typename mpl::eval_if< boost::is_same<iter_,last_> , mpl::identity< big_int<bit_size> > , mpl::deref<iter_> >::type type ; };
  10. 10. 2. 你的新武器 Boost Library <ul><li>什麼是 Boost Library ? </li></ul><ul><ul><li>Boost 是由 C++ 標準委員會 Library 工作組等,一群最頂尖的 C++ 專家發起的,而且它即將成為 C++ 的標準程式庫! </li></ul></ul><ul><ul><li>Boost 顧名思義是一堆的小程式庫的集合體,它小至字串演算法,大到資料結構的 Graph ,或是 C++ 最缺乏的 Process/Thread 的程式庫都支援了,甚至連令人匪夷所思的 Meta-Programming Library – MPL 都是 Boost 裡的名作,而 MPL 展現出各種高度彈性的 Compiling-time algorithms ,也是未來 C++ 發展的新方向。 有了 C++ 委員會各大高手背書, Boost 的高品質與嚴謹度都是你我可以信賴。 </li></ul></ul>
  11. 11. Http://www.boost.org
  12. 12. 3. Visual C++ 使用 Boost <ul><li>Boost 安裝非常容易 !! </li></ul><ul><ul><li>解壓縮後 </li></ul></ul><ul><ul><li>由於 Boost 大部分是 Header File ,需要用的時候就直接 include ,有必要的 CPP 再 Link 即可。 </li></ul></ul><ul><ul><li>我不建議你用 jam 將 boost 全部編譯成 Lib ,因為… </li></ul></ul>這個目錄就是 Source 所在位置 各 Library 文件與說明放這邊
  13. 13. 4. 第一次 Boost 親密接觸 <ul><li>Part 1: 字串處理 </li></ul><ul><li>Part 2: 任意型別 </li></ul><ul><li>Part 3: 動態資源管理 </li></ul><ul><li>Part 4: 還有一些小玩具 </li></ul>
  14. 14. Part 1: 字串處理 <ul><li>每個 C/C++ Programmer 都知道字串處理的痛苦 ! </li></ul><ul><ul><li>例如 “ Visual C++, Boost, Birdman” 如果我們想用逗點把字串分解,那你也許會這樣寫 : </li></ul></ul>
  15. 15. Boost String Algorithms Library <ul><li>有了 Boost 之後… </li></ul>#include <boost/algorithm/string.hpp> using namespace boost::algorithm; int main() { string str1(&quot;Visual C++, Boost, Birdman&quot;); vector< string > SplitVec; split ( SplitVec, str1, is_any_of (&quot;,&quot;) ); } for( int i=0;i<SplitVec.size();i++){ cout <<SplitVec[i] <<endl; } copy( SplitVec.begin(), SplitVec.end(), ostream_iterator<string>(cout, &quot; &quot;));
  16. 16. 還有更多 <ul><li>Boost String Algorithms Library 包含 </li></ul><ul><ul><li>Case conversion </li></ul></ul><ul><ul><li>Predicates and Classification </li></ul></ul><ul><ul><li>Trimming </li></ul></ul><ul><ul><li>Find algorithms </li></ul></ul><ul><ul><li>Replace Algorithms </li></ul></ul><ul><ul><li>Find Iterator </li></ul></ul><ul><ul><li>Split </li></ul></ul><ul><li>補足了 STL String 的不足 </li></ul><ul><ul><li>字串轉大寫 to_upper( ) </li></ul></ul><ul><ul><li>字串轉小寫 to_lower( ) </li></ul></ul><ul><ul><li>刪除前後空白 trim( ) </li></ul></ul><ul><ul><li>除去某字串 erase_all( ) </li></ul></ul><ul><ul><li>判斷內含某字串 contains() </li></ul></ul><ul><li>http://www.boost.org/doc/html/string_algo/quickref.html </li></ul>
  17. 17. 數字轉字串 <ul><li>每次在討論區上都會看到這樣的問題 “小女子求救,請問如何將數字轉字串 ?” </li></ul><ul><li>各位豬哥的解法如下: </li></ul><ul><ul><li>sprintf( strbuf, “%d”, MyValue); </li></ul></ul><ul><ul><ul><li>Xxxf() 這樣的 C 函數不要再用了 </li></ul></ul></ul><ul><ul><ul><ul><li>不定參數的函數非常不安全 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>且沒有 Type-Safety 。 </li></ul></ul></ul></ul><ul><ul><li>string mystr(MyValue); </li></ul></ul><ul><ul><ul><li>別傻了,這樣根本不能編譯, C++ 的 std::string 沒有這個 constructor 。 </li></ul></ul></ul><ul><ul><li>為了小女子集團,你會怎麼寫 ?? </li></ul></ul><ul><li>不管是 Java 、 C# 其他的語言都有這些功能。不然 MFC 的 CString 或是 VCL 的 AnsiString 都有耶,那 C++…Orz </li></ul>
  18. 18. Boost::lexical_cast <ul><li>應有盡有,一應俱全 </li></ul><ul><ul><li>Boost 提供了一個 lexical_cast<> 隨你轉來轉去,用法類似內建的 dynamic_cast<> 。 </li></ul></ul>123 = lexical_cast< int >(&quot;123&quot;) 123 = lexical_cast< int >(L&quot;123&quot;) 1.23 = lexical_cast< double >(&quot;1.23&quot;) true = lexical_cast< bool >('1') false = lexical_cast< bool >('0') “ 1.23” = lexical_cast< std::string >(1.23) L'A' = lexical_cast< wchar_t >(L'A') L&quot;1.11&quot;= lexical_cast< std::wstring >(1.11)
  19. 19. Type Casting <ul><li>C++ Type-Casting Operator (not function!) </li></ul><ul><ul><li>const_cast </li></ul></ul><ul><ul><li>reinterpret_cast </li></ul></ul><ul><ul><li>static_cast </li></ul></ul><ul><ul><li>dynamic_cast </li></ul></ul><ul><li>為什麼 Casting Operator 要用角括號 </li></ul><ul><ul><li>XXX_cast<type-id>( expression ) </li></ul></ul><ul><ul><li>Birdman :因為… </li></ul></ul>
  20. 20. Part 2: 任意型別 <ul><li>Boost::any 是一種萬用容器, any 的操作具有型別安全,所以你再也不用使用 void* 。 </li></ul>int i = 10; string str = &quot;Hi there&quot;; Vector<boost::any> SuperContainer; SuperContainer.push_back( boost::any(i) ); SuperContainer.push_back( boost::any(str) ); try {    if(SuperContainer[0].type() == typeid(int) )       i = any_cast <int>(a1);    if(SuperContainer[0].type() == typeid(string) )       str = any_cast <string>(a2); }catch( bad_any_cast & e){    cout << &quot;Bad any cast! &quot;; } int i = 10; string str = &quot;Hi there&quot;; vector< void* > SuperContainer; SuperContainer.push_back( static_cast<void*>(&i) ); SuperContainer.push_back( static_cast<void*>(&str) ); cout << *( static_cast<int*> (SuperContainer[0])); cout << *( static_cast<string*> (SuperContainer[1])); 好可怕的轉型 !!!
  21. 21. Part 3 : 動態資源管理 <ul><li>動態記憶體配置 (Dynamic Memory Allocation) </li></ul><ul><ul><li>我們在程式中盡可能的不要使用動態記憶體配置 ( 也就是 new) ,除非你的需求如下 </li></ul></ul><ul><ul><ul><li>必須在執行過程中才算出物件的數量 </li></ul></ul></ul><ul><ul><ul><li>效率的問題,必須傳遞指標 </li></ul></ul></ul><ul><ul><ul><li>記憶體的限制,只能在 Heap 上配置 </li></ul></ul></ul><ul><ul><ul><li>有其他明確的設計目的 </li></ul></ul></ul><ul><ul><li>為什麼我們如此告誡 ? </li></ul></ul><ul><ul><ul><li>因為它很容易讓你犯錯 </li></ul></ul></ul><ul><ul><li>來個小小測驗 ! </li></ul></ul>
  22. 22. 請問哪個有問題 ?
  23. 23. 寫程式要培養敏銳的 “嗅覺” ! <ul><li>你覺得這段程式有可能會有什麼問題 ? </li></ul>String EvaluateSalaryAndReturnName ( Employee e ) { TBird* pBird = new TBird; if( e.Title() == &quot;CEO&quot; || e.Salary() > 100000 ) { cout << e.First() << &quot; &quot; << e.Last() << endl; } delete pBird; return e.First() + &quot; &quot; + e.Last(); }
  24. 24. Exception-Safety 的重要性跟複雜性 <ul><li>如果出現資源配置跟清除的區塊,要特別小心流程的控制。例如 Exception 的出現時,很容易造成資源沒有正確被清除,產生 Resource-Leak 。 </li></ul><ul><li>為了達到上述的安全要求,程式的複雜度會大大提高。被加入跟主流程無關的 Exception-Handling Code ,如 Try-Catch Block 等等。 </li></ul>
  25. 25. try-finally termination TStringList * ListHolder = new TStringList; __try { // Do something } __finally { delete ListHolder; }; TStringList * ListHolder = new TStringList; try { // Do something } catch(…){ delete ListHolder; }; delete ListHolder;
  26. 26. Example: STL auto_ptr auto_ptr<TStringList> ListHolder( new TStringList); ListHolder->Add(&quot;String&quot;); ListHolder->Add(“Hi ! Birdman&quot;); … TStringList* ListHolder= new TStringList; __try { ListHolder->Add(&quot;String&quot;); ListHolder->Add(“Hi ! Birdman&quot;); … // bala bala.. }__finally { delete ListHolder; }
  27. 27. Smart Pointer 通常沒有你想的那麼聰明 ! <ul><li>請注意這個 auto_ptr 的 ownership 轉移 </li></ul>Main (){ auto_ptr<TStringList> ListHolder( new TStringList); ListHolder->Add(&quot;String&quot;); ListHolder->Add(“Hi ! Birdman&quot;); … ShowStringList( ListHolder ); … ListHolder->Add(“I am smart!&quot;); } ShowStringList ( auto_ptr<TStringList> p ) { … } auto_ptr 只要傳給其他函數,你就慘了 ~ ListHolder Main() p ShowStringList()
  28. 28. 還好有 Boost <ul><li>Boost 提供了多種 Smart Pointer ,其中適合我們使用的是 shared_ptr </li></ul><ul><ul><li>shared_ptr 跟 auto_ptr 不同的是可以讓有多人擁有指向物件的擁有權,直到最後一個人釋放的時候再進行物件的清除。 </li></ul></ul>Main (){ shared_ptr<TStringList> ListHolder( new TStringList); ListHolder->Add(&quot;String&quot;); ShowStringList( ListHolder ); … ListHolder->Add(“I am smart!&quot;); } ShowStringList ( shared_ptr<TStringList> p ) { … }
  29. 29. 其他的 Smart Pointer <ul><li>此外 Boost 提供其他用途的 Smart Pointer </li></ul><ul><ul><li>shared_ptr </li></ul></ul><ul><ul><ul><li>符合 C++ STL 的 CopyConstructible 和 Assignable 要求,所以可被用於 STL 的 container 中。 </li></ul></ul></ul><ul><ul><li>scoped_ptr </li></ul></ul><ul><ul><ul><li>比 auto_ptr 更嚴格,沒有“共用所有權”或是“所有權轉讓”語義。同時,它也是不可複製的( noncopyable ),只要離開 scope 就一定消滅 ! </li></ul></ul></ul><ul><ul><li>weak_ptr </li></ul></ul><ul><ul><ul><li>為了解決 shared_ptr 造成的循環引用 ( cyclic dependency ) 問題 </li></ul></ul></ul><ul><ul><li>intrusive_ptr </li></ul></ul><ul><ul><ul><li>為了降低 shared_ptr 的空間耗損, intrusive_ptr 提供了一個折中的解決方案。它提供了一個輕量級的引用計數器,但必須物件本身已經有了一個引用計數器 </li></ul></ul></ul>
  30. 30. Part 4: 還有一些小玩具 <ul><li>說實在的 Boost 真的蠻雜的,有的沒的一大堆 </li></ul><ul><li>Boost Uitilty 裡有蠻多好用的小東西,我們先來兩個玩玩看︰ </li></ul><ul><ul><li>checked_delete </li></ul></ul><ul><ul><li>noncopyable </li></ul></ul>
  31. 31. boost/checked_delete.hpp <ul><li>試想一下,這會如何 ? </li></ul>
  32. 32. 實作 <ul><li>利用 sizeof 來做檢查,如果是不完全的型別,便會 Compile Error 。 </li></ul><ul><li>想不到讓軟體產生 Error ,居然也是一種設計手法  。 </li></ul>template<class T> inline void checked_delete(T * x) { typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; (void) sizeof (type_must_be_complete); delete x; }
  33. 33. 不給你複製 !! noncopyable <ul><li>有時候我們希望物件是不能被複製的,例如 Singleton 物件或是其他重要資料的物件。 </li></ul>Class TBirdman { … }; int main() { TBirdman SuperBird; Tbirdman Bird2( SuperBird ); // 我不希望使用者這麼做 }
  34. 34. 5. C++ 幻術 – Metaprogramming <ul><li>因為篇幅的關係,在開始前請大家複習一下 </li></ul><ul><ul><li>Typede 怎麼使用 ? </li></ul></ul><ul><ul><li>C++ 的 Templates 有兩種,是哪兩種 ? </li></ul></ul><ul><ul><li>什麼是 Template Parameter? </li></ul></ul><ul><ul><li>那麼 Template Template Parameter? </li></ul></ul><ul><ul><li>什麼是 Partial Template Specialization? </li></ul></ul><ul><ul><li>什麼是 Function Overloading? </li></ul></ul><ul><ul><li>什麼是 Overload Resolution? </li></ul></ul><ul><li>我知道你還沒準備完成,但是遊戲要開始了 </li></ul>
  35. 35. <ul><li>Template Specialization </li></ul><ul><li>Partial Template Specialization </li></ul>template <class T> class String { // stuff }; template <> class String<char> { // stuff }; // primary template template <class T, class Allocator> class vector { // stuff }; // partial specialization template <class Allocator> class vector<bool, Allocator> { // stuff };
  36. 36. Meta-Programming : <ul><li>Kuso The C++ !! ( Fibonacci ) </li></ul>#include <iostream> using namespace std; template <unsigned int n, unsigned int f1 = 1, unsigned int f2 = 1> struct fib_n { const static unsigned int value = fib_n<n-1, f2, f1+f2>::value; }; template<unsigned int f1, unsigned int f2> // F_0 = 1, F_1 = 1 struct fib_n<0,f1,f2> { const static unsigned int value = f1; }; int main() { cout << fib_n<0>::value << endl; cout << fib_n<1>::value << endl; cout << fib_n<2>::value << endl; cout << fib_n<3>::value << endl; cout << fib_n<4>::value << endl; }
  37. 37. Detecting Convertibility and Inheritance <ul><li>有一個很有趣的主題,再討論 Type 間的關係。其中有一個便是偵測型別間的轉換。 </li></ul><ul><li>我希望能有程式有這樣的能力 : </li></ul>class TBird{…}; class TFlyingBird : public TBird{…}; class TBirdman{…}; class TSuperBirdman : private TFlyingBird{…}; --- cout << Conversion< TBirdman, TBird >::exists; cout << Conversion< TFlyingBird, TBird >::exists; cout << Conversion< TSupperBirdman,TBird >::exists;
  38. 38. Idea 1 <ul><li>根據 Exmaple 3 的經驗,給我們靈感。下面的程式可以測試 T 型別是否可以轉成 U 。 </li></ul>bool Conversion(U){return true;} Main() { T myT; cout << Conversion(myT); } bool Conversion(U){return true;} bool Conversion(…){return false;} Main() { T myT; cout << Conversion(myT); }
  39. 39. Idea 2 <ul><li>用 template class, 來包裝成一個 Type Function 。 </li></ul>
  40. 40. <ul><li>Boost:: is_polymorphic </li></ul>給一個型別 T ,如得知它是 Polymorphic Class? Class TMother { virtual void Chatter( TChild ); }; Class TBirdman { void Fly(); };
  41. 41. 魔法般的 Boost Lambda <ul><li>Boost 中的 Functional Programming 也很有趣 </li></ul><ul><li>來看一些例子 </li></ul>
  42. 42. Boost 是未來的標準嗎 ? <ul><li>Boost 與 C++ 的未來 </li></ul><ul><ul><li>Boost 是由 C++ 委員會部分成員所創建, Boost 的目標之一就是為可能加入到 C++ 標準中的能力但當測試環境。這一切的結果是 14 個新加入到 TR1 中的庫有超過 2/3(10 個 ) 是以 Boost 的工作為基礎。 </li></ul></ul><ul><ul><li>1998 第一份標準出現,加入 90 年代重要的 Generic Programming 概念,也稱為 C++98 或是 C++ 1.0 。 </li></ul></ul><ul><ul><li>2003 修正草案,也稱為 C++1.1 </li></ul></ul><ul><ul><li>預計 2008 年 C++ 2.0 將會出爐,目前 TR1 也進去標準了 </li></ul></ul><ul><ul><li>但是我覺得 C++ 委員會很會拖, 2008 很難說 :D </li></ul></ul>
  43. 43. 你學到什麼 ? <ul><li>設計思維的交互作用, GP 與 OO </li></ul><ul><li>C++ 中的泛型程式設計的難處 </li></ul>
  44. 44. Q&A Questions and Answers
  45. 45. Reference <ul><li>Boost, http://www.boost.org </li></ul><ul><li>http://groups.google.com/group/comp.lang.c++.moderated/topics </li></ul><ul><li>Modern C++ Design: Generic Programming and Design Patterns Applied. Andrei Alexandrescu </li></ul><ul><li>C++ Coding Standards: 101 Rules, Guidelines, and Best Practices. Herb Sutter, Andrei Alexandrescu </li></ul><ul><li>Effective C++: 50 Specific Ways to Improve Your Programs and Design. Scott Meyers </li></ul><ul><li>More Effective C++: 35 New Ways to Improve Your Programs and Designs. Scott Meyers </li></ul><ul><li>Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library. Scott Meyers </li></ul><ul><li>Exceptional C++: 47 New Engineering Puzzles, Programming Problems, and Solutions. Herb Sutter </li></ul><ul><li>More Exceptional C++: 40 New Engineering Puzzles, Programming Problems. and Solutions. Herb Sutter </li></ul><ul><li>Exceptional C++ Style: 40 New Engineering Puzzles, Programming Problems. and Solutions Herb Sutter </li></ul><ul><li>The Boost Graph Library: User Guide and Reference Manual. Jeremy G. Siek, Lie-Quan Lee, Andrew Lumsdaine </li></ul><ul><li>C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond David Abrahams, Aleksey Gurtovoy </li></ul>

×