C 學習(二) 學會使用stringstream

2022-04-10 09:20:28 字數 2393 閱讀 5656

今天在cpptemplatetutorial群裡,有人問了乙個問題:這一堆add怎麼簡化掉 **如下:

1 #include 2 #include 3 #include 

4 #include 5 #include 6

struct myval : public std::variant

710 myval(int v) : base

(v) {}

11 myval(double v) : base

(v) {}

12 myval(std::string v) : base

(v) {}

1314 myval(myval const& v) : base

(v) {}

15 myval(myval&& v) : base

(std::move(v)) {}

16};

1718 template

19 myval add(t const& a, u const&b)

2223 myval add(std::string

const& a, int

b) 26 myval add(std::string

const& a, double

b) 29 myval add(std::string

const& a, std::string

const&b)

3233 myval add(int a, std::string

const&b)

36 myval add(double a, std::string

const&b)

3940 myval operator+(myval const& a, myval const&b)

41, a, b);43}

4445 std::ostream& operator

<

46, b);48}

4950

intmain() , , };

55if (m.find("

3") ==m.end())

5659 }

view code

一種解決方法是:給to_string加個string過載,不過這並不是最好的辦法。另一種方法是使用stringstream。不過,想到前一段時間,我還經常用c語言的sprintf,我突然覺得有點好笑。

處理問題的優先方式應該是充分考慮語言的特性,使得問題處理起來更加簡潔高效一點。學會使用stringstream,可以避免一些由c語言中類似atoi,itoa ,strtol以及sprintf帶來的問題。

那麼,這個問題如果使用stringstream可以這樣寫:

c++標準庫中的提供了比ansi c的更高階的一些功能,即單純性、型別安全和可擴充套件性。

為什麼要學習stringstream。如果你已習慣了風格的轉換,也許你首先會問:為什麼要花額外的精力來學習基於的型別轉換呢?也許對下面乙個簡單的例子的回顧能夠說服你。假設你想用sprintf()函式將乙個變數從int型別轉換到字串型別。為了正確地完成這個任務,你必須確保證目標緩衝區有足夠大空間以容納轉換完的字串。此外,還必須使用正確的格式化符。如果使用了不正確的格式化符,會導致非預知的後果。下面是乙個例子:

int n=10000

; chars[

10]; sprintf(s,"%d

",n);//

s中的內容為"10000"

到目前為止看起來還不錯。但是,對上面**的乙個微小的改變就會使程式崩潰: 

int n=10000;char s[10];sprintf(s,"

%f",n);//

看!錯誤的格式化符

在這種情況下,程式設計師錯誤地使用了%f格式化符來替代了%d。因此,s在呼叫完sprintf()後包含了乙個不確定的字串。要是能自動推導出正確的型別,那不是更好嗎?

庫定義了三種類:istringstream、ostringstream和stringstream,分別用來進行流的輸入、輸出和輸入輸出操作。另外,每個類都有乙個對應的寬字符集版本。簡單起見,我主要以stringstream為中心,因為每個轉換都要涉及到輸入和輸出操作。

注意,使用string物件來代替字元陣列。這樣可以避免緩衝區溢位的危險。而且,傳入引數和目標物件的型別被自動推導出來,即使使用了不正確的格式化符也沒有危險。

在過去留下來的程式**和純粹的c程式中,傳統的形式的轉換伴隨了我們很長的一段時間。但是,如文中所述,基於stringstream的轉換擁有型別安全和不會溢位這樣搶眼的特性,使我們有充足得理由拋棄而使用。庫還提供了另外乙個特性—可擴充套件性。你可以通過過載來支援自定義型別間的轉換。

學會使用SafeArray

學會使用safearray也是很重要的,因為在ado程式設計中經常要用。它的主要目的是用於automation中的陣列型引數的傳遞。因為在網路環境中,陣列是不能直接傳遞的,而必須將其包裝成safearray。實質上safearray就是將通常的陣列增加乙個描述符,說明其維數 長度 邊界 元素型別等資...

學會使用Git

作為一名人民的好幹部,如果希望被惦記,可以學我們的鄭書記,將自己和藹可親的光輝形象搬上檯曆 作為一名有夢想有追求而又不知道如何出名的人,你可以參考對岸的 超想被包養 社團。而作為乙個核心愛好者,要想成為一名核心開發者,為核心貢獻自己的 我們必須要能夠與其他眾多的核心開發者協同工作,這就意味著應該能夠...

學會使用SafeArray

學會使用safearray也是很重要的,因為在ado程式設計中經常要用。它的主要目的是用於automation中的陣列型引數的傳遞。因為在網路環境中,陣列是不能直接傳遞的,而必須將其包裝成safearray。實質上safearray就是將通常的陣列增加乙個描述符,說明其維數 長度 邊界 元素型別等資...