前言
在用C++進行編碼的時候,有時候需要經常用到字元串+數值,但是C++又不内置這種計算,這個時候就需要我們自己重載運算符+來實作上述功能。
一、C++的運算符重載
C++的運算符重載有兩種方式,一種是在類内重載,另外一種則是在類外。類内重載時可以直接通路類中所有資料成員,而在類外,除非是友元重載,否則隻能通路到公有成員,而我們今天的主角string的情況就屬于後者。
二、重載思路
用過string的同學應該知道,string可以直接+string、char*、char,但是不能加int、double等,是以我們在重載的時候隻要把int、double等轉換為string就可以直接相加了。。
三、具體步驟
1.引用頭檔案< string >與< type_traits >友善我們進行字元串與數值間的轉換與參數類型判斷。當然也有其他的轉換方法,具體見:
最全的C/C++字元串與數值間的轉換
#include<string>
#include<type_traits>
2.重載運算符+
using namespace std;
//string + num
template<typename _Ty>
typename enable_if_t< is_integral_v<_Ty> || is_floating_point_v<_Ty>, string >
operator +(const string& str, const _Ty& num)
{
return str + to_string(num);
}
// num + string
template<typename _Ty>
typename enable_if_t< is_integral_v<_Ty> || is_floating_point_v<_Ty>, string >
operator +(const _Ty& num, const string& str)
{
return to_string(num) + str;
}
全部代碼
#include<string>
#include<type_traits>
#include<iostream> //僅用了cout
using namespace std;
template<typename _Ty>
typename enable_if_t< is_integral_v<_Ty> || is_floating_point_v<_Ty>, string >
operator +(const string& str, const _Ty& num)
{
return str + to_string(num);
}
template<typename _Ty>
typename enable_if_t< is_integral_v<_Ty> || is_floating_point_v<_Ty>, string >
operator +(const _Ty& num, const string& str)
{
return to_string(num) + str;
}
int main()
{
string str = "Today is ";
str = str + 2021 + '.' + 3 + "." + 30;
cout << str << endl;
system("pause");
}
疑惑解答
- typename : 指明後面的 enable_if_t<bool,type>是一種類型
- enable_if_t : 實際是 enable_if <bool,type>:type 是C++14引入的模闆參數判斷,隻有bool為true時才能通過編譯,并表現為 type
- is_integral_v<_Ty>:判斷是否是整形,int ,long等
- is_floating_point_v<_Ty>:判斷是否是浮點型,float ,double等
- const _Ty& : 常引用,這樣就算是 123 這個的常量也可以引用
- to_string(num) :把num轉換為string,定義在< string >裡
- 為什麼要用enable_if_t:因為string+char等已經重載過了,我們這邊再重載就會報錯
- 寫完無法運作?:請確定你的編譯器支援C++14及以上。如果是VS的話,可以在 項目/屬性/配置屬性/C++語音标準裡更改
總結
希望本文可以增加大家對C++運算符重載的一些認識,感謝觀看。