Вопрос по типизации - страница 3

 
Ilya Malev:

Наверное должно на этапе компиляции выдаваться ошибка template mismatch.


А вот в ситуации, когда есть объект array

Такой ошибки уже возникать не должно, потому что в первом случае вызов Array[int] используется как левый параметр операции =, и не является переменной double, а во втором случае как правый, причем левый параметр является переменной типа double.

Вы не слышите, ничего оно не должно - перегрузка по типу запрещена и об этом явно написано в C++ стандарте (а мкл как С++ подобном - вероятно тоже):

Certain function declarations cannot be overloaded:

- Function declarations that differ only in the return type, the exception specification (18.4), or both
cannot be overloaded.

Вероятную причину назвал выше. Так что ваши operator'ы[] - невалидны.

 
pavlick_:

Вы не слышите, ничего оно не должно - перегрузка по типу запрещена и об этом явно написано в C++ стандарте:

Вероятную причину назвал выше. Так что ваши operator'ы[] - невалидны.

Я отвечал Вам не о стандарте, а о логике исходя из здравого смысла. Ваше определение "вероятной" причины моих доводов не отменяет. Возможность перегрузки операции типизации (в т.ч. неявной) не противоречит процитированному Вами стандарту, поскольку перегружается операция приведения к конкретному явно определяемому из контекста типу.

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


П.С. Разумеется мой приведенный выдуманный код противоречит стандарту. Но если уж нужно Вам расшифровать (поскольку я сам по ходу темы выяснял для себя, как правильнее сформулировать вопрос), то выглядеть код должен так:

class Array{

public:

Array *operator[] (int i){ id = i; return GetPointer( this ); }

double operator double(){ return data[i]; }

Array *operator=(double d){ data[id]=d; return GetPointer( this ); }

private:

double data[10];

int id;

};



int OnStart(){

  Array array;

  double d=123.456;

  array[5]=d;

  d=array[5];

}
 
Если выступаете за введение operator type() - то отлично. Если за отступ от плюсов, то я против (разрешив перегрузку по возвращаемуму типу) для решения какой-то частной задачи (которую наверняка можно решить иначе и красивее - вот как-то никогда не извращался подобным образом как в первом сообщении).
 
pavlick_:
Если выступаете за введение operator type() - то отлично. Если за отступ от плюсов, то я против (разрешив перегрузку по возвращаемуму типу) для решения какой-то частной задачи (которую наверняка можно решить иначе и красивее - вот как-то никогда не извращался подобным образом как в первом сообщении).

Да. в итоге именно за введение оператора типизации. Поскольку он решает именно ту задачу, которую я ставил в начальном посте ветки, только более "конвенциальным" (вписывающимся в стандарты, и вообще, наверное, более правильным) способом.

 
Ilya Malev:

П.С. Разумеется мой приведенный выдуманный код противоречит стандарту.

Почему же противоречит, в плюсах вполне валидный. А в мкл толком доков и нет.
 
pavlick_:
Почему же противоречит, в плюсах вполне валидный. А в мкл толком доков и нет.

Потому что там изначально две одинаковых функции operator[] были с разным типом возврата (во втором варианте я это исправил). Это запрещено стандартом. А приводить типы (в том числе неявно) не запрещено, просто ещё не успели реализовать. Учитывая ударную скорость развития mql5 уверен, что рано или поздно реализуют. Особенно если кто-то ещё кроме меня обратит на это внимание на форуме...

 
Ilya Malev:

Потому что там две одинаковых функции operator[] были с разным типом возврата. Это запрещено стандартом. А приводить типы (в том числе неявно) не запрещено, просто ещё не успели реализовать. Учитывая ударную скорость развития mql5 уверен, что рано или поздно реализуют. Особенно если кто-то ещё кроме меня обратит на это внимание на форуме...

Я про последний код - он нормальный.

 
pavlick_:

Я про последний код - он нормальный.

Он нормальный, но в mql5 пока не работает. Будем следить и надеяться за новшествами в mql5. Вот именно эта невозможность адекватной реализации объекта массива, из-за невозможности оперировать с пользовательским типом также, как с обыкновенным массивом, лично меня сильно коребит уже давно. Делаешь свой массив, и он как бы изначально оказывается ущербным, не обладающим тем же удобством использования, как встроенные.

 
Ilya Malev:

Он нормальный, но в mql5 пока не работает. Будем следить и надеяться за новшествами в mql5. Вот именно эта невозможность адекватной реализации объекта массива, из-за невозможности оперировать с пользовательским типом также, как с обыкновенным массивом, лично меня сильно коребит уже давно. Делаешь свой массив, и он как бы изначально оказывается ущербным, не обладающим тем же удобством использования, как встроенные.

Ну я больших чудес не жду, язык уже не особо развивают, сомневаюсь, что добавят оператор приведения. Вот меня конкретно напрягает невозможность сделать так:

class Q {};

Q q;
// что то делаем и решаем переинициализировать q
q = Q();  // ошибка, нужно извратиться:

Q temp;
q = temp;

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

 
pavlick_:

Ну я больших чудес не жду, язык уже не особо развивают, сомневаюсь, что добавят оператор приведения. Вот меня конкретно напрягает невозможность сделать так:

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

Не очень понятно, в чем проблема. Разве нельзя вынести инициализацию объекта в отдельный метод типа Init(), может даже виртуальный?