Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами / 20 сообщений из 20, страница 1 из 1
11.04.2013, 14:17
    #38221807
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
Как лучше в 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
11.04.2013, 15:34
    #38222032
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
статические строки,

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

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

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


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

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

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

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

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

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

Код: 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
11.04.2013, 20:14
    #38222661
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
А так:

Код: 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
11.04.2013, 20:17
    #38222662
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
А так:

Код: 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
11.04.2013, 20:31
    #38222675
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
В итоге вот такая вот программулина получилась:

Код: 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
11.04.2013, 21:07
    #38222695
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
Dimitry SibiryakovAnatoly Moskovskyтребуется насколько я понял, чтобы был просто массив, вообще без
оверхеда - ровно столько занимал на стеке сколько байтов в строке.
Константы-литералы лежат разве не в сегменте кода?
Они там могут лежать. А могут и в сегменте данных лежать. Зависит от компилятора и настроек.
...
Рейтинг: 0 / 0
11.04.2013, 22:15
    #38222737
ДохтаР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
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
12.04.2013, 01:16
    #38222818
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
ДохтаРalloca
Ну, оберните это в класс строки - посмотрим что выйдет :)

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

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

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

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

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

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

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

Но я не совсем понимаю как это защищать от дурака.
...
Рейтинг: 0 / 0
12.04.2013, 02:15
    #38222837
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
Попробовал по возможности по максимуму использовать встроенные средства 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
12.04.2013, 02:51
    #38222841
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
Чуть поправил:
Код: 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
12.04.2013, 13:41
    #38223414
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
Вот, финальный вариант :)
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
12.04.2013, 14:50
    #38223548
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше в C++ сделать статические строки по примеру char[], но с имеющимися операторами
Код: plaintext
1.
static_string<20>


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


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