看板 C_and_CPP 關於我們 聯絡資訊
今天學弟問我個問題, "CString" 如何轉成 "long" 作業環境是在 Visual Studio 2005 & "Use Unicode Character Set" 學弟 google 的結果找到了一個 solution CString showID = _T("1234"); long id = _ttol(showID); 我看了一下 code 有點... 這種 api 要怎麼記憶阿 我最多記得 C 用的 atoi 之類的 ~ 每次寫的時候都要 google 太累了 我記得之前看書有個不錯的寫法,我花了一些時間重現出來~ 基本想法如下: CString showID = _T("1234"); wstring wstr = showID.XXX() // XXX 為 CString 轉 string 的成員函式 long id = from_wstring<long>(wstr); 因為 CString 是 MFC 專用的,所以我寫一個通用的 string 轉 long 而 CString 只要再想辦法轉成 string 就好 [註: 上述說明 string 泛指 wstring or string] CString showID = _T("1234"); long id = from_wstring<long>(showID.GetBuffer(0)); // show.GetBuffer(0) 我是google的,有人知道更好的轉換方式嗎? CString -> string 我為 muti-byte 和 unicode 個寫個一個版本如下: ======================================== #include <iostream> #include <string> using namespace std; template <typename T> T from_string(const string& s) { istringstream is(s); T t; if(! (is >> t) ) throw "bad string"; return t; } template <typename T> T from_wstring(const wstring& s) { wistringstream is(s); T t; if(! (is >> t) ) throw "bad string"; return t; } ========================================== 這樣不管你要轉甚麼型態(不要太奇怪的= =)都很方便了 請安心服用XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.216.177.57
LPH66:這樣不會在 template resolve 的時候出現 ambiguous 問題嗎? 07/13 17:21
LPH66:(template 的各版本之間只差回傳型態) 07/13 17:21
loveme00835:丟字元指標變成作exception handling更麻煩= =而且沒 07/13 17:31
loveme00835:有在前面加上你會丟例外的宣告... 07/13 17:32
tinlans:你都用 istringstream 了,幹嘛不考慮 operator>> 07/13 17:43
tinlans:的 overloading,讓 argument 能傳乾淨一點? 07/13 17:44
tinlans:不然起碼針對 CString 做個特化版也行。 07/13 17:49
tinlans:但是最根本的問題還是在包那層 istringstream 根本沒必要 07/13 17:58
tinlans:,轉失敗丟 exception 會發生很多有的沒的問題。 07/13 17:59
Hubert:boost::lexical_cast ? 07/13 23:24
avhacker:原PO: boost 就有這玩意了 http://j.mp/aAvRQI 07/13 23:44
tinlans:附帶補充一下,轉失敗除了丟 exception, 07/14 08:20
tinlans:也能用 boost::optional 來包 return type。 07/14 08:21
spider391:謝謝 a 大~ 07/19 10:06