C++ は文字列 + 値を実装します

序文

C++ でコーディングする場合、文字列 + 値を頻繁に使用する必要がある場合がありますが、C++ にはこの種の計算が組み込まれていません。このとき、上記の機能を実現するには演算子 + をオーバーロードする必要があります。


1. C++ における演算子のオーバーロード

C++ で演算子をオーバーロードするには 2 つの方法があります。1 つはクラス内でオーバーロードする方法、もう 1 つはクラス外でオーバーロードする方法です。クラス内でオーバーロードする場合、クラス内のすべてのデータ メンバーに直接アクセスできますが、クラスの外では、フレンド オーバーロードでない限り、パブリック メンバーのみにアクセスでき、今日の主人公の文字列は後者に属します。

2. アイデアを詰め込みすぎる

string を使用したことのある学生は、string を直接 + string、char*、char にすることができますが、int、double などを追加することはできないことを知っているはずです。そのため、オーバーロードする場合は、int、double などを string に変換するだけで済みます。直接追加してください。

3. 具体的な手順

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>: integer、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++ Voice Standard で変更できます。

要約する

この記事が C++ 演算子のオーバーロードについての理解を深めていただければ幸いです。ご覧いただきありがとうございます。

おすすめ

転載: blog.csdn.net/weixin_46068322/article/details/115322463