fork download
  1. #include<array>
  2. #include<vector>
  3. #include<string>
  4. #include<iostream>
  5. #include<cstring>
  6.  
  7. template<size_t N, typename T = char>
  8. class static_string {
  9. std::array<T, N> static_array;
  10. public:
  11. template<size_t M>
  12. static_string(std::array<T, M> const& str) {
  13. enum { size = (N < M)?N:M };
  14. memcpy(static_array.data(), str.data(), size*sizeof(T));
  15. if(size < N) static_array[size] = 0;
  16. }
  17.  
  18. template<size_t M>
  19. static_string(const T (&str)[M]) {
  20. enum { size = (N < M)?N:M };
  21. memcpy(static_array.data(), str, size*sizeof(T));
  22. if(size < N) static_array[size] = 0;
  23. }
  24.  
  25. static_string(std::basic_string<T> const& str) {
  26. const size_t size = (N < str.size())?N:str.size();
  27. memcpy(static_array.data(), str.data(), size*sizeof(T));
  28. if(size < N) static_array[size] = 0;
  29. }
  30.  
  31. template<size_t M>
  32. static_string& operator=(std::array<T, M> const& str) {
  33. static_string temp(str);
  34. static_array.swap(temp.static_array);
  35. return *this;
  36. }
  37.  
  38. template<size_t M>
  39. static_string& operator=(const T (&str)[M]) {
  40. static_string temp(str);
  41. static_array.swap(temp.static_array);
  42. return *this;
  43. }
  44.  
  45. static_string& operator=(std::basic_string<T> const& str) {
  46. static_string temp(str);
  47. static_array.swap(temp.static_array);
  48. return *this;
  49. }
  50.  
  51. operator std::basic_string<T>() const {
  52. std::basic_string<T> temp;
  53. for(size_t i = 0; i < N && static_array[i] > 0; ++i)
  54. temp.push_back(static_array[i]);
  55. return temp;
  56. }
  57.  
  58. const T* data() const noexcept { return static_array.data(); }
  59.  
  60. bool operator<(static_string const& str) const { return static_array < str.static_array; }
  61. bool operator==(static_string const& str) const {
  62. return !strcmp(static_array.data(), str.static_array.data());
  63. }
  64. };
  65.  
  66. template<size_t N, typename T>
  67. std::ostream& operator<< (std::ostream& os, static_string<N, T> const& str) {
  68. return (os << std::string(str));
  69. }
  70.  
  71. int main() {
  72.  
  73. char p1[] = "abcd";
  74. static_string<20> str1 = p1;
  75. static_string<20> str2 = "qwerty";
  76. static_string<20> str3 = std::string("zxcvb");
  77. static_string<20> str4 = static_string<20>("abcd");
  78.  
  79. str1 = p1;
  80. str2 = "qwerty";
  81. str3 = std::string("zxcvb");
  82. str4 = static_string<20>("abcd");
  83.  
  84. str3 = str2;
  85.  
  86. std::string str = str1;
  87. str1 = str;
  88. std::cout << str << std::endl << std::endl;
  89.  
  90. std::vector<static_string<20>> vec_str = {str1, str2, str3, str4};
  91.  
  92. std::cout << std::boolalpha;
  93. for(const auto &i : vec_str) {
  94. for(const auto &k : vec_str) {
  95. std::cout << "(" << i << " == " << k << ") = " << (i == k) << std::endl;
  96. }
  97. }
  98.  
  99. std::cout << std::endl << str1 << "," << str2 << "," << str3 << "," << str4 << "," << std::endl;
  100.  
  101. static_string<20, wchar_t> str5 = std::wstring(L"zxcvb");
  102. std::wstring wstr = str5;
  103. str5 = wstr;
  104.  
  105.  
  106. return 0;
  107. }
Success #stdin #stdout 0s 2988KB
stdin
Standard input is empty
stdout
abcd

(abcd == abcd) = true
(abcd == qwerty) = false
(abcd == qwerty) = false
(abcd == abcd) = true
(qwerty == abcd) = false
(qwerty == qwerty) = true
(qwerty == qwerty) = true
(qwerty == abcd) = false
(qwerty == abcd) = false
(qwerty == qwerty) = true
(qwerty == qwerty) = true
(qwerty == abcd) = false
(abcd == abcd) = true
(abcd == qwerty) = false
(abcd == qwerty) = false
(abcd == abcd) = true

abcd,qwerty,qwerty,abcd,