Re: [問題] C++用marco debug的寫法

看板C_and_CPP作者 (朴髮箍)時間14年前 (2011/04/07 03:02), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串4/4 (看更多)
※ 引述《AntaresStar ()》之銘言: : 有點離題 只是有點好奇 : Null & operator <<( std::ostream & (*)( std::ostream & ) ) : 這個為什麼不能寫成 : template <typename T> Null & operator <<( T & (*)( T & ) ) : 如果改這樣就會不能編繹 很奇怪 : ※ 引述《legnaleurc (CA)》之銘言: std::endl 的宣告長成這樣, 它是一個 function template: template <class charT, class traits> basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os); 當你將 std::endl插入到串流中時, 編譯器會幫你具現化出一個版 本, 這樣才有位址可以傳入 operator<< 當參數, 需要何種的版本 由串流物件決定: cout << endl; // 具現化 endl<char, // char_traits<char> > wcout << endl; // 具現化 endl<wchar_t, // char_traits<wchar_t> > - 在L大原程式碼中當你寫下 : Null() << endl; 等於明白的跟編譯器講「我要一個 signature 如 ostream& ???( ostream& ) 的函式作為引數」, 所以編譯器就幫 你生了一個版本來解決: endl<char, char_traits<char> > 但如果你把 L大程式碼修改為 template <typename T> Null& operator <<( T & (*)( T & ) ); 語法來說並無問題, 呼叫時的語義就變成跟編譯器講「我要一個函 式, 只要他接受一個左值參考, 回傳左值參考, 任何型態都行!」, 但是依照前例, 編譯器能產生的 endl版本至少有兩種: 1. endl<char,char_traits<char> > 2. endl<wchar_t,char_traits<wchar_t> > 所以編譯器並不知道給你哪個函式實體才是對的, 甚至是這個也行 ... int& plus_one( int &a ){ return ++a; } _DEBUG << plus_one; -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (04/07 03:28)

04/07 19:38, , 1F
精妙 <(_ _)>
04/07 19:38, 1F
文章代碼(AID): #1DdBY_SV (C_and_CPP)
文章代碼(AID): #1DdBY_SV (C_and_CPP)