序文
C++ でコーディングする場合、文字列 + 値を頻繁に使用する必要がある場合がありますが、C++ にはこの種の計算が組み込まれていません。このとき、上記の機能を実現するには演算子 + をオーバーロードする必要があります。
1. C++ における演算子のオーバーロード
C++ で演算子をオーバーロードするには 2 つの方法があります。1 つはクラス内でオーバーロードする方法、もう 1 つはクラス外でオーバーロードする方法です。クラス内でオーバーロードする場合、クラス内のすべてのデータ メンバーに直接アクセスできますが、クラスの外では、フレンド オーバーロードでない限り、パブリック メンバーのみにアクセスでき、今日の主人公の文字列は後者に属します。
2. アイデアを詰め込みすぎる
string を使用したことのある学生は、string を直接 + string、char*、char にすることができますが、int、double などを追加することはできないことを知っているはずです。そのため、オーバーロードする場合は、int、double などを string に変換するだけで済みます。直接追加してください。。
3. 具体的な手順
1. ヘッダーファイル<string>と<type_traits>を参照し、文字列と値の変換やパラメータの型の判定を容易にします。もちろん、他の変換方法もあります。以下を参照してください。
#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 で変更できます。