![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Всем привет.
Хотел сделать 2 типа таким образом, чтобы преобразование из одного в другой было бы невозможно, несмотря на то, что по сути эти типы одинаковые. Сделал такой код:
foo1 отрабатывает (как и должна), на foo2 ругается (как и должна). Но затем сделал так:
и это - отрабатывает (хотя мне бы хотелось, чтобы выдавалась ошибка). Эту тему - механизм "улучшенного" typedef - смотрел, но, как я понял, тогда решения не нашли (кроме mpl, которую не хочется тянуть ради такой задачи) Спасибо. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
во первых - для тех кто желает ознакомиться с макросом , он определен тут: http://gitorious.org/boost/svn/blobs/maste...ong_typedef.hpp
в твоем примере, нежелательное поведение происходит из-за перегруженных operator type(); если их закомментировать, то все ок. пример:
http://liveworkspace.org/code/62d1803c53fc...125a31db9e76ecd а вот почему(и как это исправить) operator type() дает такой эффект - это нужно у более компетентных полюбопытствовать. Это сообщение отредактировал(а) boostcoder - 21.11.2011, 09:59 |
||||
|
|||||
| math64 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Можно так:
В случае vector (и других классов) можно так:
Это сообщение отредактировал(а) math64 - 21.11.2011, 10:09 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
еще два способа:
1. закоментить operator=() для "голого" типа. 2. указать для operator=() "голого" типа спецификатор =delete. math64, ну почему вы так безобразно код пишите? или вы не рассчитываете что его читать будут? Добавлено через 4 минуты и 30 секунд странный какой-то strong typedef получается.. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
мдааа. похоже BOOST_STRONG_TYPEDEF не получится использовать (даже убрав оператор приведения к T), т.к. не получится использовать так
обычный typedef в этом плане предпочтительней, но он даёт привести что хочешь к чему хочешь... на ИРКе посоветовали boost::units ушёл курить юнитс'ы. Добавлено @ 10:27 math64, в Вашем примере не выдаётся ошибки, а мне нужно, чтобы выдавалась. Ведь T1 и T2 - разные типы. Это сообщение отредактировал(а) borisbn - 21.11.2011, 10:28 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
я бы поступил так:
т.е. удалил бы operator=() для T Добавлено @ 11:41 какой-то конкретный шаблон? или его еще и отрыть нужно? Это сообщение отредактировал(а) boostcoder - 21.11.2011, 12:21 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
borisbn, если Вам нужно это для действительно для request и response, то не мучайте ни себя, ни людей, а заведите по структуре на каждый..
(или, хотя бы, от общего шаблона получайте..) не пожалаете, в отличии от того, если реализуете через тайпдеф... Это сообщение отредактировал(а) mes - 21.11.2011, 15:36 |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
при обычном typedef'е есть
вообще-то я request и response привёл как пример. ведь существует ещё множество "типов", поведение которых выглядит в точности как vector< unsigned char >, но их нельзя (по логике) присваивать друг другу... если бы typedef не давал возможности приведения (или его как-то можно было запретить), то он бы меня устраивал по-полной программе... поэтому ж и начал -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если быть точными (а значит вместо слово выглядят ставим являются), то практически нету , по крайней мере я не встречал Добавлено через 3 минуты и 26 секунд а где Выши любимые замечание по нарушению правил русского языка.. прочитал как я написал, волосы дыбом встали.. поправил Добавлено через 4 минуты и 45 секунд в С++ typedef и не является def type`ом Добавлено через 6 минут в общем для приведенного случая напрашивается максимум packet<request> и packet<response>.. Это сообщение отредактировал(а) mes - 21.11.2011, 15:28 |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
я решил, что макать гуру Си++ - себе дороже - отыграется на Си-плюс-плюсе
как это ? я пробовал
foo1 и foo2 вызываются с одним типом packet< request_t > без ошибок... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну это вы загнули.. Это сообщение отредактировал(а) mes - 21.11.2011, 17:36 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
получается, что без промежуточного .v не обойтись... жаль.
получается либо так
либо как Вы написали (через шаблонный packet)... склоняюсь к Вашему варианту... Всем спасибо. Закрываю. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
1. перегрузкой -> 2. определением полноценного интерфейса (рекомендуется) |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |