今天在cpptemplatetutorial群裡,有人問了乙個問題:這一堆add怎麼簡化掉 **如下:
1 #include 2 #include 3 #includeview code4 #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 }
一種解決方法是:給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就是將通常的陣列增加乙個描述符,說明其維數 長度 邊界 元素型別等資...