![]() |
|
Модераторы: bsa |
![]()
|
|
| GoldFinch |
|
||||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
класс с буфером
код записи в буфер
несколько ранее код выглядел как
вроде должно быть оптимальнее за счет memcpy, но в отладочной версии не работает из за кривой реализации отладочной версии итератора end(), который при разыменовывании не проверяет новое значение _Mylast а юзает старое как лучше организовать добавление в буфер данных различных типов? |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
mes, мне хочется писать любой POD тип, например так:
вариант с insert мне не нравится тем что я сомневаюсь что insert развернет цикл и будет копировать по 4 байта а вариант с memcpy (или __movsd) хорош из за ее intrinsic формы, но в отладочной версии не работает Это сообщение отредактировал(а) GoldFinch - 24.5.2009, 21:54 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
я знаю, что Вы все равно останетесь при своем мнение, но, имхо, стиль программирования, продемонстрированный в этом топике, идет в разрез с принципами C++
и предполагаю, что именно из за этих двух причин, тема остается без ответов. Это сообщение отредактировал(а) mes - 25.5.2009, 20:13 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
mes, как же решить эту задачу, согласно принципам С++ ?
надо организовать бинарный буфер(поток) в который будут записываться данные различных типов, предпочитаемый синтаксис
где data1-dataN - данные различных типов stuff(), chksum, crypt(), send - манипуляторы на данный момент все комбинации и типы данных неизвестны, однако т.к. данные будут передаваться по сети, там будут только POD-типы и как организовать эту запись разнородных данных? |
|||
|
||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
класс потока не должен обладать ничем лишним, кроме того что действительно ему требуется. В нашем случае мы ограничиваем его интерфейс функцией write, принимающей на вход два условных итератора, на последовательность символов на входе, с которой можно манипулировать по своему желанию. Для этого перегружаем operator << для каждого нужного типа для POD`ов можно пойти на уступку, и сделать функцию-конвертер, для получения нужных итераторов на бинарную последовательность тут можно схимичить Вашим способом.
Но надо бы обеспечить гарантию того, что с помощью конвертера в поток попадут только подходящие типы. тут два варианта, либо вручную для каждого типа описать оператор << (думаю самый оптимальный вариант)
либо привлечь кого-нибудь, например, Loki::TypeList или boost::is_pod. в итоге :
Это сообщение отредактировал(а) mes - 26.5.2009, 03:07 |
||||||||
|
|||||||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
mes, я не понимаю зачем писать сотни одинаковых строк кода, потом постоянно еще что дописывать, если можно применить 1 шаблон для любого типа.
Чтобы идиоты не смогли кинуть в поток указатель? Так ведь человек который понимает что он делает - указатели туда где они будут невалидными передавать не будет. А если случайно передаст, то на другом конце это сразу будет видно. |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
если уверены что все используемые объекты типа POD, напишите один шаблонный оператор. Суть не в этом, а в том, чтоб класс стрим был лишен знаний о конвертации. также чтоб не писать много, можно просто
ну это легко решается, путем добавления шаблонной функции перегруженного для указателей.
ну или просто оставить ее без определения :
Это сообщение отредактировал(а) mes - 26.5.2009, 09:03 |
||||||
|
|||||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
оператор << какбэ намекает на то, что поток - символьный и данные форматируются, то-есть тут будет полный когнитивный диссонанс у человека, пытающегося написать свой оператор << для вашего буфера Добавлено через 8 минут и 37 секунд
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Lazin, а почему end указатель на константу, а begin нет ?
|
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
||||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
потому-что делать *detail::end<SomeType>(mydata) = 0; в корне неправильно, begin то-же должен быть const Добавлено через 4 минуты и 6 секунд
:facepalm в контексте стандартной библиотеки потоков это именно форматирование, для записи в поток двоичных данных там используется метод write и метод put. Когда программист видит подобный синтаксис:
то о двоичном сдвиге он как-то незадумывается даже |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
а делать *detail::begin<SomeType>(mydata) =0; правильно ?! не знаю, как для Вас, но для меня в плане константности оба итератора равноправны. Добавлено через 4 минуты и 55 секунд
вместо этой функции, будут лучше две функции возвращающие (условные) итераторы. Это сообщение отредактировал(а) mes - 26.5.2009, 12:33 |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |