当前位置:   article > 正文

C++实现 字符串+数值_c++ string 加数字

c++ string 加数字

前言

在用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>
  • 1
  • 2

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

全部代码

#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");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

疑惑解答

  • 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++运算符重载的一些认识,感谢观看。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/63494
推荐阅读
相关标签
  

闽ICP备14008679号