Шаблоны функций и приведение типов — что за дискриминация bool? - страница 3

 
Koldun Zloy:

Не существует нормального приведения стринга к булу.

Это вопрос договоренности.

В MQL достаточно таких мест, которых "не бывает", но они все же есть.

Чем может навредить приведение "0" и "false" к false, а всего остального — к true?

Опять же, не забываем, что речь о явном приведении.

 

Если Вы по ошибке присвоите булу строку, и при этом не будет неоднозначности, компилятор не будет требовать явного преобразования.

Он просто молча преобразует, а Вы потом будете долго искать эту ошибку.

 
Koldun Zloy:

Если Вы по ошибке присвоите булу строку, и при этом не будет неоднозначности, компилятор не будет требовать явного преобразования.

Он просто молча преобразует, а Вы потом будете долго искать эту ошибку.

Видимо, не понимаю о чем идёт речь. Можете привести пример, когда это приведение будет иметь место без моего явного и намеренного (bool)string_var? 
 
Andrey Khatimlianskii:
Видимо, не понимаю о чем идёт речь. Можете привести пример, когда это приведение будет иметь место без моего явного и намеренного (bool)string_var? 

В простом примере Вы с этим может и не столкнётесь, а в сложной программе за всем не уследишь.

Часто приходится переписывать участки кода и заменять одни функции другими.

Например, Вы можете заменить вызов одной функции на похожую, но возвращающую не bool, а string.

 

Скорее всего просто не доделано, забили разработчики и все.

Не стали голову ломать, тру ли -1, или фальш.

Даблы-то из каких угодно строк приводятся:

double z=(double)"1d3"; // работает

А перегруженная функция для bool очень даже не плохо. Можно даже всякие "yes" и "now" правильно преобразовать. Да и для даблов хорошо иметь отдельную функцию, чтобы менять запятую на точку.

 
Koldun Zloy:

В простом примере Вы с этим может и не столкнётесь, а в сложной программе за всем не уследишь.

Часто приходится переписывать участки кода и заменять одни функции другими.

Например, Вы можете заменить вызов одной функции на похожую, но возвращающую не bool, а string.

Не могу представить ситуацию, где вот так вот просто заменю бул на стринг.

Ну, а если в коде (string)some_thing, то нужно быть в любом случае внимательным.

 
Dmitry Fedoseev:

Скорее всего просто не доделано, забили разработчики и все.

Не стали голову ломать, тру ли -1, или фальш.

Даблы-то из каких угодно строк приводятся:

double z=(double)"1d3"; // работает

А перегруженная функция для bool очень даже не плохо. Можно даже всякие "yes" и "now" правильно преобразовать. Да и для даблов хорошо иметь отдельную функцию, чтобы менять запятую на точку.

Нет, не забили.

Строки бывают совсем разные. Поэтому совершенно непонятно, что имеет в виду автор проверки строки на false - отсутствие строки (NULL, строка нулевой длины), "0" или "false". Для true ещё более кучеряво может быть.

Поэтому проверяйте каждый раз конкретно
 
Vladimir Simakov:
Начнем с терминологии. Не бывает true и false, бывает набор из 8/16/32/64 бит. У них справка, конечно для недоджунов написана, но принцип тот же 0×0 - false, все остальное true. Так, что любая строка, ненулевой длины - это true. Теперь про приведение их string к различным типам. В принципе никаких проблем реализовать это нет, но тогда следующая тема будет: "я хочу проверить строку на пустоту написав if(!var), ЧТО РАЗВЕ СЛОЖНО РЕАЛИЗОВАТЬ???". ИМХО: нефиг реализацию всяких невнятных вещей просить, даже каст string->int/double считаю, что зря сделан. Кому надо - пишите свою обертку над string и там изголяйтесь как хотите.
PS благая мысль от этой темы возникла: проверить наличие перегрузки приведения класса к типам в mql.

Сам дурак. 

 
Andrey Khatimlianskii:
Видимо, не понимаю о чем идёт речь. Можете привести пример, когда это приведение будет иметь место без моего явного и намеренного (bool)string_var? 

Какой будет результат? 

 
Slava:
Нет, не забили.

Строки бывают совсем разные. Поэтому совершенно непонятно, что имеет в виду автор проверки строки на false - отсутствие строки (NULL, строка нулевой длины), "0" или "false". Для true ещё более кучеряво может быть.

Поэтому проверяйте каждый раз конкретно

Явное приведение из-за этого же пострадало?

"if ( some_string )" ведь не то же самое, что "(string)some_string"?