天天看點

C++實作 字元串+數值前言一、C++的運算符重載二、重載思路三、具體步驟總結

前言

在用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++運算符重載的一些認識,感謝觀看。

繼續閱讀