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++运算符重载的一些认识,感谢观看。

猜你喜欢

转载自blog.csdn.net/weixin_46068322/article/details/115322463