Re: [問題] C++用marco debug的寫法
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):