Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator T () 
V
    Опции темы
GoldFinch
Дата 1.10.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



какие проблемы могут возникнуть при использовании
  operator T () {return x;}
по сравнению с 
  T get() {return x;}
?

(когда-то слышал что этот оператор не всегда хорош, но забыл почему)

я хочу написать код
Код

class Foo
{
public:
    /*implicit*/ Foo(const std::string& value) : value_(value) {}
    Foo& operator=(const std::string& rhs) {value_.assign(rhs);}

    template<typename T>
    operator T () const { return boost::lexical_cast<T>(value); }

private:
    const std::string& value_;
};


Это сообщение отредактировал(а) GoldFinch - 1.10.2009, 17:46
PM MAIL ICQ   Вверх
zim22
Дата 1.10.2009, 17:47 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(GoldFinch @  1.10.2009,  17:40 Найти цитируемый пост)
(когда-то слышал что этот оператор не всегда хорош, но забыл почему)

не хорош он неявным преобразованием типа.


--------------------
PM MAIL   Вверх
GoldFinch
Дата 1.10.2009, 17:49 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



zim22, т.е.? мне вобщем-то это и надо, чтобы
работало
T x = foo; //Foo foo;
PM MAIL ICQ   Вверх
zim22
Дата 1.10.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



самый простой пример, иллюстрирующий проблему:
Код

class X {
public:
  X(int);
  operator int();
};
int operator+(X, X);

10 + X(1); // неоднозначность

***
вот, что в умной книжке пишут:
Цитата

Проблемы conversion operator:
* Они могут стать неисчерпаемым источником ошибок времени компиляции. Проблемы возникают тогда, когда существует несколько способов преобразования одного типа в другой.
* Когда в двух классах определены функции преобразования друг в друга, весьма вероятна неоднозначность.



Это сообщение отредактировал(а) zim22 - 1.10.2009, 18:12


--------------------
PM MAIL   Вверх
GoldFinch
Дата 1.10.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



значит если нет функций, принимающих Foo, то все норм?
PM MAIL ICQ   Вверх
zim22
Дата 1.10.2009, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(GoldFinch @  1.10.2009,  18:32 Найти цитируемый пост)
значит если нет функций, принимающих Foo, то все норм?

всё будет норм, если не будет функций принимающих Foo, возвращающих Foo, использующих Foo, ... smile


--------------------
PM MAIL   Вверх
GoldFinch
Дата 1.10.2009, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(zim22 @  1.10.2009,  19:43 Найти цитируемый пост)
всё будет норм, если не будет функций принимающих Foo, возвращающих Foo, использующих Foo, ... smile 

но при этом они должны быть еще и перегружены для T

ясно. у меня таких не планируется
PM MAIL ICQ   Вверх
xvr
Дата 2.10.2009, 10:16 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Не должно быть пользовательских преобразований в обе стороны: т.е. если A можно неявно преобразовать в B, то не должно быть неявного преобразования B в A
В частности поэтому std::string нельзя преобразовать в char*, а надо явно звать c_str()

PM MAIL   Вверх
kemiisto
Дата 2.10.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 2
Всего: 160



Цитата(zim22 @  1.10.2009,  18:59 Найти цитируемый пост)
самый простой пример, иллюстрирующий проблему:

Как мне кажется, тут проблема не в conversion operator, а в конструкторе, который надобно объявить как explicit. В Google C++ Style Guide есть про это.

А если ещё точнее, тут проблема в языке! smile 

Это сообщение отредактировал(а) kemiisto - 2.10.2009, 11:23


--------------------
PM MAIL WWW GTalk Jabber   Вверх
bsa
Дата 2.10.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



kemiisto, не уверен, что std::string::string(const char *) нужно объявлять explicit.
PM   Вверх
kemiisto
Дата 2.10.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 2
Всего: 160



bsa, там по ссылке есть ряд исключений:
Цитата

The exception is copy constructors, which, in the rare cases when we allow them, should probably not be explicit. Classes that are intended to be transparent wrappers around other classes are also exceptions. Such exceptions should be clearly marked with comments. 

std::string, в каком-то смысле, можно считать обёрткой для char*. smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
GoldFinch
Дата 2.10.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



kemiisto, если мне надо неявное (implicit) преобразование - мне надо использовать неявное преобразование.

Добавлено через 3 минуты и 23 секунды
используя conversion operator я заметил что я могу написать
    T t = foo; // Foo { operator T() ... } foo;
но немогу написать
   1+foo
из за ошибки "не найден operator+(int,Foo)"

с этим можно что-то сделать?
PM MAIL ICQ   Вверх
zim22
Дата 2.10.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(GoldFinch @  2.10.2009,  17:14 Найти цитируемый пост)
с этим можно что-то сделать?

определить  operator+(int,Foo)? smile


--------------------
PM MAIL   Вверх
GoldFinch
Дата 2.10.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



zim22, лень.
их (операторов) слишком много, а юзать boost.preprocessor мне не хочется

Это сообщение отредактировал(а) GoldFinch - 2.10.2009, 17:43
PM MAIL ICQ   Вверх
zim22
Дата 2.10.2009, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(GoldFinch @  2.10.2009,  17:43 Найти цитируемый пост)
zim22, лень.

ну тогда
Код

template <typename T>
T operator+(T, Foo) {
  return T();
}

Foo f1("12");  
1 + f1;

 smile 
***
хотя это и не избавляет от необходимости определять для каждой операции шаблонную функцию...
***
мне в голову только ещё один вариант пришёл: обработка python|perl... 

Это сообщение отредактировал(а) zim22 - 2.10.2009, 18:23


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0827 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.