| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > operator T () |
| Автор: GoldFinch 1.10.2009, 17:40 | ||
| какие проблемы могут возникнуть при использовании operator T () {return x;} по сравнению с T get() {return x;} ? (когда-то слышал что этот оператор не всегда хорош, но забыл почему) я хочу написать код
|
| Автор: zim22 1.10.2009, 17:47 | ||
не хорош он неявным преобразованием типа. |
| Автор: GoldFinch 1.10.2009, 17:49 |
| zim22, т.е.? мне вобщем-то это и надо, чтобы работало T x = foo; //Foo foo; |
| Автор: zim22 1.10.2009, 17:59 | ||||
самый простой пример, иллюстрирующий проблему:
*** вот, что в умной книжке пишут:
|
| Автор: GoldFinch 1.10.2009, 18:32 |
| значит если нет функций, принимающих Foo, то все норм? |
| Автор: zim22 1.10.2009, 18:43 |
всё будет норм, если не будет функций принимающих Foo, возвращающих Foo, использующих Foo, ... |
| Автор: xvr 2.10.2009, 10:16 |
| Не должно быть пользовательских преобразований в обе стороны: т.е. если A можно неявно преобразовать в B, то не должно быть неявного преобразования B в A. В частности поэтому std::string нельзя преобразовать в char*, а надо явно звать c_str() |
| Автор: kemiisto 2.10.2009, 11:22 |
Как мне кажется, тут проблема не в conversion operator, а в конструкторе, который надобно объявить как explicit. В Google C++ Style Guide есть про http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Explicit_Constructors. А если ещё точнее, тут проблема в языке! |
| Автор: bsa 2.10.2009, 11:50 |
| kemiisto, не уверен, что std::string::string(const char *) нужно объявлять explicit. |
| Автор: kemiisto 2.10.2009, 12:16 | ||
bsa, там по ссылке есть ряд исключений:
std::string, в каком-то смысле, можно считать обёрткой для char*. |
| Автор: GoldFinch 2.10.2009, 17:14 |
| kemiisto, если мне надо неявное (implicit) преобразование - мне надо использовать неявное преобразование. Добавлено через 3 минуты и 23 секунды используя conversion operator я заметил что я могу написать T t = foo; // Foo { operator T() ... } foo; но немогу написать 1+foo из за ошибки "не найден operator+(int,Foo)" с этим можно что-то сделать? |
| Автор: zim22 2.10.2009, 17:41 |
определить operator+(int,Foo)? |
| Автор: GoldFinch 2.10.2009, 17:43 |
| zim22, лень. их (операторов) слишком много, а юзать boost.preprocessor мне не хочется |
| Автор: zim22 2.10.2009, 17:52 | ||
ну тогда
*** хотя это и не избавляет от необходимости определять для каждой операции шаблонную функцию... *** мне в голову только ещё один вариант пришёл: обработка python|perl... |
| Автор: GoldFinch 2.10.2009, 18:23 |
| zim22, я ж говорю операторов много, каждый руками перегружать, для (T,Foo), (Foo,T), (Foo,Foo) - слишком долго, а с препроцессором тоже как-то не очень |
| Автор: mes 2.10.2009, 20:16 |
| мне кажется что для данного совета по данному вопросу слишком много абстрактности.. имхо, подход сильно зависит от того, кем является foo по отношению к Т и что представляет из себя T ? |
| Автор: GoldFinch 2.10.2009, 20:45 | ||
mes, это выглядит так
создается объект Query query("x=1&y=2"); и из него потом читаются значения int x = query["x"]; int y = query["y"]; |
| Автор: mes 2.10.2009, 21:59 | ||
а проблемa когда query[..] участвует в операциях ? там нужно явно указывать куда следует преобразовывать RVar. Думаю лучше, чтоб не было неясностей, преобразование скрыть за шаблоной функцией, например
|
| Автор: GoldFinch 2.10.2009, 22:12 |
| mes, так и сделал) |