powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
20 сообщений из 20, страница 1 из 1
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38221807
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами сравнения?
Допустим std::array<> имеет операторы сравнения, но не имеет удобных operator=(char *) и operator char, для взаимодействия со строковой константой "abcd". И не может быть ей инициализирован, приходиться писать: std::array<char, 50> a = {'a', 'b', 'c' }; что намного неудобней чем char a[] = "abc";
Т.е. из std полностью не подходит ни один из вариантов: динамические(string, vector<>), статические (char[], array<>).

На основании каких стандартных средств лучше сделать статическую строку или может уже есть готовая в boost?
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222032
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
статические строки,

Тут есть два варианта.
1) Указывать длину строки аргументом шаблона и тогда строку можно хранить прямо в объекте
2) Если не указывать длину строки, то ее можно будет хранить только в куче

Для п.1 я стандартных классов не знаю, но сделать такой класс чтобы его можно было инициализировать/присваивать строковым литералом элементарно

С п.2 отлично справляется std::string
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222227
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, оператор == для двух const char* не перегружается?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222261
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky1) Указывать длину строки аргументом шаблона и тогда строку можно хранить прямо в объекте


Я когда то давно рисовал велосипед на тему строк, STL я не знал и не видел.
Со всеми операторами сравнения конструкторами копирования итд итп

Если размер строки меньше 8-16-32..... байт ( как задефайнишь) , строка лежит в стеке.
Если больше это место в стеке используется как указатель на область памяти в куче
и прочие параметры управления этой памятью.
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222537
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаР,

То что вы описали умеет std::string (по крайней мере в GCC).

А требуется насколько я понял, чтобы был просто массив, вообще без оверхеда - ровно столько занимал на стеке сколько байтов в строке.
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222547
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА что, оператор == для двух const char* не перегружается?..

Насколько я помню, в перегруженных глобальных операторах хотя бы один из аргументов должен быть классом.
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222632
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyтребуется насколько я понял, чтобы был просто массив, вообще без
оверхеда - ровно столько занимал на стеке сколько байтов в строке.
Константы-литералы лежат разве не в сегменте кода?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222654
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикольно.

Написал программку:

Код: plaintext
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.
26.
27.
#include <iostream>
#include <stdlib.h>

int main()
{
  const char *s1 = "string 1";
  const char *s2 = "string 2";
  const char *s3 = "string 3";
  const char *s4 = "string 4";
  const char *s5 = "string 1";

  const char* a[5];
  a[0] = s1;
  a[1] = s2;
  a[2] = s3;
  a[3] = s4;
  a[4] = s5;

  for( unsigned i = 0; i < 5; ++i )
    for( unsigned j = 0; j < 5; ++j )
      {
        std::cout << "s" << i + 1 << " == " << "s" << j + 1 << ": " << ( a[i] == a[j] ? "true" : "false" )
                  << std::endl;
      }

  return 0;
}



Вот результат её работы:

Код: plaintext
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.
26.
27.
ziv@xxx:~/tmp$ ./a
s1 == s1: true
s1 == s2: false
s1 == s3: false
s1 == s4: false
s1 == s5: true
s2 == s1: false
s2 == s2: true
s2 == s3: false
s2 == s4: false
s2 == s5: false
s3 == s1: false
s3 == s2: false
s3 == s3: true
s3 == s4: false
s3 == s5: false
s4 == s1: false
s4 == s2: false
s4 == s3: false
s4 == s4: true
s4 == s5: false
s5 == s1: true
s5 == s2: false
s5 == s3: false
s5 == s4: false
s5 == s5: true


Всегда s5 == s1 !
Так зачем писать какой-то там ещё оператор ?
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222661
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так:

Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
#include <iostream>
#include <stdlib.h>

bool operator < (const char *l, const char *r)
{
  return strcmp( l, r ) < 0;
}

bool operator == (const char *l, const char *r)
{
  return !strcmp( l, r );
}

int main()
{
  const char *s1 = "string 1";
  const char *s2 = "string 2";
  const char *s3 = "string 3";
  const char *s4 = "string 4";
  char s5data[] = "string 1";
  const char *s5 = s5data;

  const char* a[5];
  a[0] = s1;
  a[1] = s2;
  a[2] = s3;
  a[3] = s4;
  a[4] = s5;

  for( unsigned i = 0; i < 5; ++i )
    for( unsigned j = 0; j < 5; ++j )
      {
        std::cout << "s" << i + 1 << " == " << "s" << j + 1 << ": " << ( a[i] == a[j] ? "true" : "false" )
                  << std::endl;
      }

  return 0;
}



будет так:

Код: plaintext
1.
2.
3.
ziv@xxx:~/tmp$ g++ -o a a.cpp && ./a
a.cpp:4:46: error: ‘bool operator<(const char*, const char*)’ must have an argument of class or enumerated type
a.cpp:9:47: error: ‘bool operator==(const char*, const char*)’ must have an argument of class or enumerated type
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222662
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так:

Код: plaintext
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.
26.
27.
28.
#include <iostream>
#include <stdlib.h>

int main()
{
  const char *s1 = "string 1";
  const char *s2 = "string 2";
  const char *s3 = "string 3";
  const char *s4 = "string 4";
  char s5data[] = "string 1";
  const char *s5 = s5data;

  const char* a[5];
  a[0] = s1;
  a[1] = s2;
  a[2] = s3;
  a[3] = s4;
  a[4] = s5;

  for( unsigned i = 0; i < 5; ++i )
    for( unsigned j = 0; j < 5; ++j )
      {
        std::cout << "s" << i + 1 << " == " << "s" << j + 1 << ": " << ( a[i] == a[j] ? "true" : "false" )
                  << std::endl;
      }

  return 0;
}



будет так:

Код: plaintext
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.
26.
27.
ziv@xxx:~/tmp$ g++ -o a a.cpp && ./a
s1 == s1: true
s1 == s2: false
s1 == s3: false
s1 == s4: false
s1 == s5: false
s2 == s1: false
s2 == s2: true
s2 == s3: false
s2 == s4: false
s2 == s5: false
s3 == s1: false
s3 == s2: false
s3 == s3: true
s3 == s4: false
s3 == s5: false
s4 == s1: false
s4 == s2: false
s4 == s3: false
s4 == s4: true
s4 == s5: false
s5 == s1: false
s5 == s2: false
s5 == s3: false
s5 == s4: false
s5 == s5: true

...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222675
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге вот такая вот программулина получилась:

Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
#include <iostream>
#include <stdlib.h>
#include <string.h>

class c_string
{
  const char* d;
public:
  c_string():d(0){}
  c_string(const c_string&l):d(l.d){}
  c_string(const char*l):d(l){}
  ~c_string(){d=0;}

  bool operator < (const c_string &r) const
  {
    return d ? strcmp( d, r.d ) < 0 : false;
  }

  bool operator == (const c_string &r) const
  {
    return d ? !strcmp( d, r.d ) : false;
  }
};

int main()
{
  c_string s1 = "string 1";
  c_string s2 = "string 2";
  c_string s3 = "string 3";
  c_string s4 = "string 4";
  char s5data[] = "string 1";
  c_string s5 = s5data;

  c_string* a[5];
  a[0] = &s1;
  a[1] = &s2;
  a[2] = &s3;
  a[3] = &s4;
  a[4] = &s5;

  for( unsigned i = 0; i < 5; ++i )
    for( unsigned j = 0; j < 5; ++j )
      {
        std::cout << "s" << i + 1 << " == " << "s" << j + 1 << ": " << ( *(a[i]) == *(a[j]) ? "true" : "false" )
                  << std::endl;
      }

  return 0;
}



Работает:

Код: plaintext
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.
26.
27.
ziv@xxx:~/tmp$ g++ -o a a.cpp && ./a
s1 == s1: true
s1 == s2: false
s1 == s3: false
s1 == s4: false
s1 == s5: true
s2 == s1: false
s2 == s2: true
s2 == s3: false
s2 == s4: false
s2 == s5: false
s3 == s1: false
s3 == s2: false
s3 == s3: true
s3 == s4: false
s3 == s5: false
s4 == s1: false
s4 == s2: false
s4 == s3: false
s4 == s4: true
s4 == s5: false
s5 == s1: true
s5 == s2: false
s5 == s3: false
s5 == s4: false
s5 == s5: true

...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222695
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAnatoly Moskovskyтребуется насколько я понял, чтобы был просто массив, вообще без
оверхеда - ровно столько занимал на стеке сколько байтов в строке.
Константы-литералы лежат разве не в сегменте кода?
Они там могут лежать. А могут и в сегменте данных лежать. Зависит от компилятора и настроек.
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222737
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
А требуется насколько я понял, чтобы был просто массив, вообще без оверхеда - ровно столько занимал на стеке сколько байтов в строке.

manSYNOPSIS
#include <alloca.h>

void *alloca(size_t size);

DESCRIPTION
The alloca() function allocates size bytes of space in the stack frame
of the caller. This temporary space is automatically freed when the
function that called alloca() returns to its caller.
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222818
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаРalloca
Ну, оберните это в класс строки - посмотрим что выйдет :)

ЗЫ. Я не говорю что нельзя - просто интересно что получится, т.к. у меня самого нет времени играться.
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222824
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyДохтаРalloca
Ну, оберните это в класс строки - посмотрим что выйдет :)

А вообще конечно alloca - это не то, т.к. цель не в стеке выделять, а в том же объекте, а тут alloca в пролете.
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222835
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyAnatoly Moskovskyпропущено...

Ну, оберните это в класс строки - посмотрим что выйдет :)

А вообще конечно alloca - это не то, т.к. цель не в стеке выделять, а в том же объекте, а тут alloca в пролете.

Я знал что он в пролете вы просили в стеке переменное количество байт,
я дал вариант .

что касается в обьекте то плейсмент нью думаю подойдет

class xxxstr
{
unsigened char x_buff[]; // можно лазить на всю длину памяти
// полученную при плейсмент нью
public:
.....
};

Но я не совсем понимаю как это защищать от дурака.
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222837
Попробовал по возможности по максимуму использовать встроенные средства C++.
Можно ли что-то упростить?
Получилось:
Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
#include<array>
#include<vector>
#include<string>
#include<iostream>
#include<cstring>

template<size_t N, typename T = char>
class static_string {
    std::array<T, N> static_array;
public:
    template<size_t M>
    static_string(std::array<T, M> const& str) {
        enum { size = (N < M)?N:M };
        memcpy(static_array.data(), str, size);        
    }
    
    template<size_t M>
    static_string(const T (&str)[M]) {
        enum { size = (N < M)?N:M };
        memcpy(static_array.data(), str, size);
        static_array[size] = 0;
    }    

    static_string(std::string const& str) {
        const size_t size = (N < str.size())?N:str.size();
        memcpy(static_array.data(), str.data(), size);
        static_array[size] = 0;
    }

    template<size_t M>
    static_string& operator=(std::array<T, M> const& str) {
        static_string temp(str);
        static_array.swap(temp);
        return *this;
    }
   
    template<size_t M>
    static_string& operator=(const T (&str)[M]) {
        static_string temp(str);
        static_array.swap(temp);
        return *this;
    }   
    
    static_string& operator=(std::string const& str) {
        static_string temp(str);
        static_array.swap(temp);
        return *this;
    }    

    operator std::string() const {
        std::string temp;
        for(size_t i = 0; i < N && static_array[i] > 0; ++i) 
            temp.push_back(static_array[i]);
        return temp;
    }
    
    const char* data() const noexcept { return static_array.data(); }
    
    bool operator<(static_string const& str) const { return static_array < str.static_array; }
    bool operator==(static_string const& str) const { return static_array == str.static_array; }
};

template<size_t N, typename T = char>
std::ostream& operator<< (std::ostream& os, static_string<N, T> const& str) {
    os << std::string(str);
    return os;
}

int main() {
    
    char p1[] = "abcd";
    static_string<20> str1 = p1;
    static_string<20> str2 = "qwerty";
    static_string<20> str3 = std::string("zxcvb");
    static_string<20> str4 = static_string<20>("abcd");

    std::string str = str1;
    std::cout << str << std::endl  << std::endl;  
  
    std::vector<static_string<20>> vec_str = {str1, str2, str3, str4};
    
    std::cout << std::boolalpha;
    for(const auto &i : vec_str) {
        for(const auto &k : vec_str) {
            std::cout << "(" << i << " == " << k << ") = " << (i == k) << std::endl;
        }        
    }
    
    std::cout << std::endl << str1 << "," << str2 << "," << str3 << "," << str4 << "," << std::endl;

    return 0;
}



выводabcd

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

abcd,qwerty,zxcvb,abcd,
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38222841
Чуть поправил:
Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
#include<array>
#include<vector>
#include<string>
#include<iostream>
#include<cstring>

template<size_t N, typename T = char>
class static_string {
    std::array<T, N> static_array;
public:
    template<size_t M>
    static_string(std::array<T, M> const& str) {
        enum { size = (N < M)?N:M };
        memcpy(static_array.data(), str, size);  
        if(M < N) static_array[size] = 0;
    }
    
    template<size_t M>
    static_string(const T (&str)[M]) {
        enum { size = (N < M)?N:M };
        memcpy(static_array.data(), str, size);
        if(M < N) static_array[size] = 0;
    }    

    static_string(std::string const& str) {
        const size_t size = (N < str.size())?N:str.size();
        memcpy(static_array.data(), str.data(), size);
        if(size < N) static_array[size] = 0;
    }

    template<size_t M>
    static_string& operator=(std::array<T, M> const& str) {
        static_string temp(str);
        static_array.swap(temp);
        return *this;
    }
   
    template<size_t M>
    static_string& operator=(const T (&str)[M]) {
        static_string temp(str);
        static_array.swap(temp);
        return *this;
    }   
    
    static_string& operator=(std::string const& str) {
        static_string temp(str);
        static_array.swap(temp);
        return *this;
    }    

    operator std::string() const {
        std::string temp;
        for(size_t i = 0; i < N && static_array[i] > 0; ++i) 
            temp.push_back(static_array[i]);
        return temp;
    }
    
    const char* data() const noexcept { return static_array.data(); }
    
    bool operator<(static_string const& str) const { return static_array < str.static_array; }
    bool operator==(static_string const& str) const { return static_array == str.static_array; }
};

template<size_t N, typename T = char>
std::ostream& operator<< (std::ostream& os, static_string<N, T> const& str) {
    os << std::string(str);
    return os;
}

int main() {
    
    char p1[] = "abcd";
    static_string<20> str1 = p1;
    static_string<20> str2 = "qwerty";
    static_string<20> str3 = std::string("zxcvb");
    static_string<20> str4 = static_string<20>("abcd");

    std::string str = str1;
    std::cout << str << std::endl  << std::endl;  
  
    std::vector<static_string<20>> vec_str = {str1, str2, str3, str4};
    
    std::cout << std::boolalpha;
    for(const auto &i : vec_str) {
        for(const auto &k : vec_str) {
            std::cout << "(" << i << " == " << k << ") = " << (i == k) << std::endl;
        }        
    }
    
    std::cout << std::endl << str1 << "," << str2 << "," << str3 << "," << str4 << "," << std::endl;

    return 0;
}
...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38223414
Вот, финальный вариант :)
http://ideone.com/cEsNhZ
Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
#include<array>
#include<vector>
#include<string>
#include<iostream>
#include<cstring>

template<size_t N, typename T = char>
class static_string {
    std::array<T, N> static_array;
public:
    template<size_t M>
    static_string(std::array<T, M> const& str) {
        enum { size = (N < M)?N:M };
        memcpy(static_array.data(), str.data(), size*sizeof(T));  
        if(size < N) static_array[size] = 0;
    }
    
    template<size_t M>
    static_string(const T (&str)[M]) {
        enum { size = (N < M)?N:M };
        memcpy(static_array.data(), str, size*sizeof(T));
        if(size < N) static_array[size] = 0;
    }    

    static_string(std::basic_string<T> const& str) {
        const size_t size = (N < str.size())?N:str.size();
        memcpy(static_array.data(), str.data(), size*sizeof(T));
        if(size < N) static_array[size] = 0;
    }

    template<size_t M>
    static_string& operator=(std::array<T, M> const& str) {
        static_string temp(str);
        static_array.swap(temp.static_array);
        return *this;
    }
   
    template<size_t M>
    static_string& operator=(const T (&str)[M]) {
        static_string temp(str);
        static_array.swap(temp.static_array);
        return *this;
    }   
    
    static_string& operator=(std::basic_string<T> const& str) {
        static_string temp(str);
        static_array.swap(temp.static_array);
        return *this;
    }    

    operator std::basic_string<T>() const {
        std::basic_string<T> temp;
        for(size_t i = 0; i < N && static_array[i] > 0; ++i) 
            temp.push_back(static_array[i]);
        return temp;
    }
    
    const T* data() const noexcept { return static_array.data(); }
    
    bool operator<(static_string const& str) const { return static_array < str.static_array; }
    bool operator==(static_string const& str) const { 
        return !strcmp(static_array.data(), str.static_array.data()); 
    } 
};

template<size_t N, typename T>
std::ostream& operator<< (std::ostream& os, static_string<N, T> const& str) {
    return (os << std::string(str));
}

int main() {
    
    char p1[] = "abcd";
    static_string<20> str1 = p1;
    static_string<20> str2 = "qwerty";
    static_string<20> str3 = std::string("zxcvb");
    static_string<20> str4 = static_string<20>("abcd");
    
    str1 = p1;
    str2 = "qwerty";
    str3 = std::string("zxcvb");
    str4 = static_string<20>("abcd");    
    
    str3 = str2;

    std::string str = str1;
    str1 = str;
    std::cout << str << std::endl  << std::endl;  
  
    std::vector<static_string<20>> vec_str = {str1, str2, str3, str4};
    
    std::cout << std::boolalpha;
    for(const auto &i : vec_str) {
        for(const auto &k : vec_str) {
            std::cout << "(" << i << " == " << k << ") = " << (i == k) << std::endl;
        }        
    }
    
    std::cout << std::endl << str1 << "," << str2 << "," << str3 << "," << str4 << "," << std::endl;

    static_string<20, wchar_t> str5 = std::wstring(L"zxcvb");
    std::wstring wstr = str5;
    str5 = wstr;
    
    
    return 0;
}

...
Рейтинг: 0 / 0
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
    #38223548
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
static_string<20>


Такое любой дурак сделает.
Нет чтоб замутить
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]