Если вы хотите использовать c++11
, вы можете использовать определяемые пользователем строковые литералы и определить два шаблона функций, которые перегружают оператор плюс для объекта std::string
и любого другого объекта. Единственный подводный камень - не перегружать плюсовые операторы std::string
, иначе компилятор не знает, какой оператор использовать. Вы можете сделать это, используя шаблон std::enable_if
из type_traits
. После этого строки ведут себя так же, как в Java или C #. Смотрите мой пример реализации для деталей.
Основной код
#include <iostream>
#include "c_sharp_strings.hpp"
using namespace std;
int main()
{
int i = 0;
float f = 0.4;
double d = 1.3e-2;
string s;
s += "Hello world, "_ + "nice to see you. "_ + i
+ " "_ + 47 + " "_ + f + ',' + d;
cout << s << endl;
return 0;
}
Файл c_sharp_strings.hpp
Включите этот заголовочный файл во все места, где вы хотите иметь эти строки.
#ifndef C_SHARP_STRING_H_INCLUDED
#define C_SHARP_STRING_H_INCLUDED
#include <type_traits>
#include <string>
inline std::string operator "" _(const char a[], long unsigned int i)
{
return std::string(a);
}
template<typename T> inline
typename std::enable_if<!std::is_same<std::string, T>::value &&
!std::is_same<char, T>::value &&
!std::is_same<const char*, T>::value, std::string>::type
operator+ (std::string s, T i)
{
return s + std::to_string(i);
}
template<typename T> inline
typename std::enable_if<!std::is_same<std::string, T>::value &&
!std::is_same<char, T>::value &&
!std::is_same<const char*, T>::value, std::string>::type
operator+ (T i, std::string s)
{
return std::to_string(i) + s;
}
#endif // C_SHARP_STRING_H_INCLUDED