[心得] string 轉 int、float、double、long ...

看板C_and_CPP作者 (小乖)時間15年前 (2010/07/13 08:34), 編輯推噓2(2012)
留言14則, 6人參與, 最新討論串1/1
今天學弟問我個問題, "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

07/13 17:21, , 1F
這樣不會在 template resolve 的時候出現 ambiguous 問題嗎?
07/13 17:21, 1F

07/13 17:21, , 2F
(template 的各版本之間只差回傳型態)
07/13 17:21, 2F

07/13 17:31, , 3F
丟字元指標變成作exception handling更麻煩= =而且沒
07/13 17:31, 3F

07/13 17:32, , 4F
有在前面加上你會丟例外的宣告...
07/13 17:32, 4F

07/13 17:43, , 5F
你都用 istringstream 了,幹嘛不考慮 operator>>
07/13 17:43, 5F

07/13 17:44, , 6F
的 overloading,讓 argument 能傳乾淨一點?
07/13 17:44, 6F

07/13 17:49, , 7F
不然起碼針對 CString 做個特化版也行。
07/13 17:49, 7F

07/13 17:58, , 8F
但是最根本的問題還是在包那層 istringstream 根本沒必要
07/13 17:58, 8F

07/13 17:59, , 9F
,轉失敗丟 exception 會發生很多有的沒的問題。
07/13 17:59, 9F

07/13 23:24, , 10F
boost::lexical_cast ?
07/13 23:24, 10F

07/13 23:44, , 11F
原PO: boost 就有這玩意了 http://j.mp/aAvRQI
07/13 23:44, 11F

07/14 08:20, , 12F
附帶補充一下,轉失敗除了丟 exception,
07/14 08:20, 12F

07/14 08:21, , 13F
也能用 boost::optional 來包 return type。
07/14 08:21, 13F

07/19 10:06, , 14F
謝謝 a 大~
07/19 10:06, 14F
文章代碼(AID): #1CF2K0D5 (C_and_CPP)