![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
какие проблемы могут возникнуть при использовании
operator T () {return x;} по сравнению с T get() {return x;} ? (когда-то слышал что этот оператор не всегда хорош, но забыл почему) я хочу написать код
Это сообщение отредактировал(а) GoldFinch - 1.10.2009, 17:46 |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
zim22, т.е.? мне вобщем-то это и надо, чтобы
работало T x = foo; //Foo foo; |
|||
|
||||
zim22 |
|
||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
самый простой пример, иллюстрирующий проблему:
*** вот, что в умной книжке пишут:
Это сообщение отредактировал(а) zim22 - 1.10.2009, 18:12 |
||||
|
|||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
значит если нет функций, принимающих Foo, то все норм?
|
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
всё будет норм, если не будет функций принимающих Foo, возвращающих Foo, использующих Foo, ... ![]() |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
||||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Не должно быть пользовательских преобразований в обе стороны: т.е. если A можно неявно преобразовать в B, то не должно быть неявного преобразования B в A.
В частности поэтому std::string нельзя преобразовать в char*, а надо явно звать c_str() |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Как мне кажется, тут проблема не в conversion operator, а в конструкторе, который надобно объявить как explicit. В Google C++ Style Guide есть про это. А если ещё точнее, тут проблема в языке! ![]() Это сообщение отредактировал(а) kemiisto - 2.10.2009, 11:23 -------------------- |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
kemiisto, не уверен, что std::string::string(const char *) нужно объявлять explicit.
|
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
bsa, там по ссылке есть ряд исключений:
std::string, в каком-то смысле, можно считать обёрткой для char*. ![]() -------------------- |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
kemiisto, если мне надо неявное (implicit) преобразование - мне надо использовать неявное преобразование.
Добавлено через 3 минуты и 23 секунды используя conversion operator я заметил что я могу написать T t = foo; // Foo { operator T() ... } foo; но немогу написать 1+foo из за ошибки "не найден operator+(int,Foo)" с этим можно что-то сделать? |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
zim22, лень.
их (операторов) слишком много, а юзать boost.preprocessor мне не хочется Это сообщение отредактировал(а) GoldFinch - 2.10.2009, 17:43 |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
ну тогда
![]() *** хотя это и не избавляет от необходимости определять для каждой операции шаблонную функцию... *** мне в голову только ещё один вариант пришёл: обработка python|perl... Это сообщение отредактировал(а) zim22 - 2.10.2009, 18:23 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |