Форум программистов, компьютерный форум CyberForum.ru

Стрoкa элeмeнтов любого типа - C++

Восстановить пароль Регистрация
 
Mee
 Аватар для Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
29.08.2011, 12:06     Стрoкa элeмeнтов любого типа #1
Нужно сделать строку для роботы с любым типом, например написать
C++
1
typеdеf chаr Chаracter
.
В конструкторе по умолчанию аргументы я записал как
C++
1
String(const Character * s = "")
, но в случае, если работаем с wchаr_t, то такое преобразование не прохожит, подскажите как можзно сделать аргумент по умолчанию подходящий для любого типа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insolent
 Аватар для insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
29.08.2011, 12:52     Стрoкa элeмeнтов любого типа #2
Mee, для любого строкового? или вообще любого типа?
Как вариант:
1) TCHAR
2) void *s
LosAngeles
Заблокирован
29.08.2011, 13:06     Стрoкa элeмeнтов любого типа #3
перегрузи конструктор
Mee
 Аватар для Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
29.08.2011, 13:09  [ТС]     Стрoкa элeмeнтов любого типа #4
Цитата Сообщение от LosAngeles Посмотреть сообщение
перегрузи конструктор
А если будут еще типы, еще несколько раз парезагружать?

Цитата Сообщение от insolent Посмотреть сообщение
Mee, для любого строкового? или вообще любого типа?
Как вариант:
1) TCHAR
2) void *s
для любого строкового, и подробней, пожалуйста
LosAngeles
Заблокирован
29.08.2011, 13:32     Стрoкa элeмeнтов любого типа #5
Цитата Сообщение от Mee Посмотреть сообщение
А если будут еще типы, еще несколько раз парезагружать?
а какие "ещё"? char и wchar_t перегрузи норм будет, хотя довольно странно, в стл как бы две различные специализации basic_stream есть wstring и string ты их чтоли скрестить пытаешься? Сделай две специализации и не парься
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
29.08.2011, 13:41     Стрoкa элeмeнтов любого типа #6
Обычно делается приблизительно вот так
C++
1
2
3
4
5
#ifdef UNICODE
    typedef wchar_t Chаracter;
#else
    typedef char Chаracter;
#endif
C++
1
2
3
4
5
#ifdef UNICODE
  #define _(s) L ## s
#else
  #define _(s) s
#endif
C++
1
String(const Chаracter* s = _(""));
Mee
 Аватар для Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
29.08.2011, 13:46  [ТС]     Стрoкa элeмeнтов любого типа #7
задание такое стоит, вот и парюсь
LosAngeles
Заблокирован
29.08.2011, 13:51     Стрoкa элeмeнтов любого типа #8
в vs если чё есть макрос _Т()
insolent
 Аватар для insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
30.08.2011, 11:50     Стрoкa элeмeнтов любого типа #9
Mee, перегрузи конструктор, как рекомендовал LosAngeles
C++
1
2
3
4
5
6
class String
{
    String(const char*);
    String(const wchar_t*);
    // добавляй типы, которые тебе нужно
};
TCHAR зависит от настройки макроса Unicode
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
30.08.2011, 12:09     Стрoкa элeмeнтов любого типа #10
Цитата Сообщение от insolent Посмотреть сообщение
перегрузи конструктор, как рекомендовал LosAngeles
Как-то я слабо себе представляю, каким образом он будет дальше с этим работать...
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
31.08.2011, 01:59     Стрoкa элeмeнтов любого типа #11
Цитата Сообщение от Mee Посмотреть сообщение
подскажите как можзно сделать аргумент по умолчанию подходящий для любого типа
Шаблоны.

Я представляю себе это как-то так:

C++
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
 
using namespace std;
 
template <typename T>
class CStr
{
protected:
    T * bufPtr;
    size_t bufSize;
 
public:
    CStr( )
    {
        bufSize = 0;
        bufPtr = 0;
    }
 
    CStr( T * src )
    {
        bufSize = 0;
        bufPtr = 0;
 
        *this = src;
    }
 
    CStr( CStr& src )
    {
        bufSize = 0;
        bufPtr = 0;
 
        *this = src;
    }
 
    ~CStr()
    {
        if( bufPtr )
           free( bufPtr );
    }
 
    size_t size( T * str )
    {
        size_t i = 0;
 
        while( str[i] != 0 )
           i++;
 
        return i;
    }
 
    size_t size( )
    {
        return bufSize;
    }
 
    void clear()
    {
        if( !bufPtr )
           return;
 
        bufPtr = (T*)realloc( bufPtr, 0 );
        bufSize = 0;
    }
 
    CStr & operator=( CStr& str )
    {
        bufPtr = (T*)realloc( bufPtr, str.size() + 1 );
        bufSize = str.size();
 
        for( size_t i = 0; i < str.size(); i++ )
           bufPtr[i] = str[i];
 
        bufPtr[ bufSize ] = 0;
 
        return *this;
    }
 
    CStr & operator=( T * str )
    {
        size_t lng = size(str);
 
        bufPtr = (T*)realloc( bufPtr, lng + 1 );
        bufSize = lng;
 
        for( size_t i = 0; i < lng; i++ )
           bufPtr[i] = str[i];
 
        bufPtr[ lng ] = 0;
 
        return *this;
    }
 
    CStr & operator=( T c )
    {
        bufPtr = (T*)realloc( bufPtr, 2 );
        bufSize = 1;
 
        *bufPtr = c;
        bufPtr[ 1 ] = 0;
 
        return *this;
    }
 
    T& operator[] ( size_t pos )
    {
        return bufPtr[pos];
    }
 
    CStr& operator+= ( CStr& str )
    {
        size_t lng = bufSize + str.size();
 
        bufPtr = (T*)realloc( bufPtr, lng + 1 );
 
        for( size_t i = 0; i < str.size(); i++ )
           bufPtr[ i + bufSize ] = str[i];
 
        bufPtr[lng] = 0;
        bufSize = lng;
 
        return *this;
    }
 
    CStr& operator+= ( T * str )
    {
        size_t str_lng = size( str );
        size_t lng = bufSize + str_lng;
 
        bufPtr = (T*)realloc( bufPtr, lng + 1 );
 
        for( size_t i = 0; i < str_lng; i++ )
           bufPtr[ i + bufSize ] = str[i];
 
        bufPtr[lng] = 0;
        bufSize = lng;
 
        return *this;
    }
 
    CStr& operator+= ( T c )
    {
        bufSize++;
        bufPtr = (T*)realloc( bufPtr, bufSize + 1 );
 
        bufPtr[bufSize - 1] = c;
        bufPtr[bufSize] = 0;
 
        return *this;
    }
 
    const T * data()
    {
        return bufPtr;
    }
};
 
template <typename T>
ostream & operator<< ( ostream &os, CStr<T> & str )
{
    for( size_t i = 0; i < str.size(); i++ )
       os << str[i];
 
    return os;
}
 
int main()
{
    CStr<char> str( "hello" );
    CStr<char> str2( "goodbye" );
 
    cout << "Initial:\n" << str << '\n' << str2 << '\n';
    cout << "str += \" mayday\": " << (str += " mayday") << '\n';
    cout << "str += str2: " << (str += str2) << '\n';
    cout << "str = str2: " << (str = str2) << '\n';
    str.clear();
    cout << "str.clear(): " << str << '\n';
 
    return 0;
}
При выводе тут всё упирается в умение std::ostream работать с элементом заданного типа. Можно так же прикрутить istream & operator>>( istream &is, CStr<T> &str );, но я затрудняюсь прочитать элементы типа T из is, итераторы (было бы интересно узнать, как их делать)... Однако, всё это уже есть в basic_stream.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2011, 13:38     Стрoкa элeмeнтов любого типа
Еще ссылки по теме:

Реализовать класс MyQueue, позволяющий хранить данные любого типа в виде очереди C++
C++ Напишите шаблон класса односвязного списка, который принимает элементы любого типа
Объявление функции, принимающей объект любого типа C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.08.2011, 13:38     Стрoкa элeмeнтов любого типа #12
C++
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
template<class T>
class String;
 
template<> 
class String<char>
{
public:
   String(const char* ptr);
   const char* c_str() const {return pointer;}
private:
   char* pointer;
};
 
template<>
class String<wchar_t>
{
public:
   String(const wchar_t* ptr);
   const wchar_t* c_str() const {return pointer;}
private:
   wchar_t* pointer;
};
 
template<class Char>
std::basic_ostream<Char>& operator <<(std::basic_ostream<Char>& stream, const String<Char>& obj)
{
    stream << obj.c_str() << std::endl;
    return stream;
}
Yandex
Объявления
31.08.2011, 13:38     Стрoкa элeмeнтов любого типа
Ответ Создать тему
Опции темы

Текущее время: 11:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru