ООП, шаблоны и макросы в mql5, тонкости и приёмы использования - страница 13

 

Только вчера обсуждали насчёт этого бага с абстрактными методами, так сегодня нарвался у себя в коде на такое же )  Раньше в базовом классе виртуальный метод был не абстрактный, поэтому я ссылался на него из наследуемых классов, потом решил сделать метод абстрактным, но компилятор не сообщил мне, что ссылаться на него уже нельзя.   В результате ошибка рекурсии - самая мерзкая и трудно-обнаруживаемая,  кучу времени убил.   Теперь вот думаю, что та фича с телом абстрактного метода по умолчанию здесь будет очень полезна, по крайней мере пока баг не поправят.

 
Alexey Navoykov:

Ага, чтоб максимально удобно было присваивать мух котлетам, и никто даже глазом не моргнул )  

Если в процессе присваивания происходит приведение мух к котлетам (либо выдается ошибка, если оно невозможно), то в этом нет ничего плохого.

Alexey Navoykov:

1.Ну тогда это просто класс A.  Зачем объявлять шаблон, если его параметр по смыслу никак не связан с поведением класса?

2.Это уж совсем жесть. Переносить типоконтроль на стадию выполнения... Ваши коды придётся годами потом отлаживать

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

2. У Вас это похоже уже на мантру - в данном случае абсолютно однозначная запись, гарантирующая что F это T, то есть как будто записи второго template и не было. но нет. Снова "годами буду потом отлаживать" ))))))

 
Ilya Malev:

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

2. У Вас это похоже уже на мантру - в данном случае абсолютно однозначная запись, гарантирующая что F это T, то есть как будто записи второго template и не было. но нет. Снова "годами буду потом отлаживать" ))))))

А почему вы в этой ветке отвечаете?  Код в одном месте, обсуждение в другом... )

1. Да всё можно сделать по-человечески, и почти без танцев:

struct __A
{
  template<typename T>
  void f(T&) { }  // Сюда структуры и классы
};

struct A : __A
{
  template<typename T>  
  void f(T) { }  // Сюда простые типы и указатели
};

2. Там вроде о другом речь шла.  Ну да не суть.

 
Alexey Navoykov:

А почему вы в этой ветке отвечаете?  Код в одном месте, обсуждение в другом... )

1. Да всё можно сделать по-человечески, и почти без танцев:

2. Там вроде о другом речь шла.  Ну да не суть.

Вы, вроде бы, пока не модератор, чтобы определять, в какой ветке что более уместно. А модераторы уже четко обозначили, что обсуждения особенностей нужно вести не в ветке самих особенностей, а в отдельной ветке, т.е. здесь.

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

 
Ilya Malev:

Вы, вроде бы, пока не модератор, чтобы определять, в какой ветке что более уместно. А модераторы уже четко обозначили, что обсуждения особенностей нужно вести не в ветке самих особенностей, а в отдельной ветке, т.е. здесь.

Так если модератор захочет перенести - одно дело.  А зачем собственноручно создавать путаницу то?  У меня например нет желания бегать по веткам

 
Alexey Navoykov:

Так если модератор захочет перенести - одно дело.  А зачем собственноручно создавать путаницу то?  У меня например нет желания бегать по веткам

Если понимаешь, что модератор скорее всего сделал бы именно так - всегда лучше сделать это самому, не дожидаясь, пока это сделает модератор. Впрочем, обсуждение действий модераторов тоже не входит в любимое меню модераторов,поэтому будет лучше если мы его прекращаем.

 
Alexey Navoykov:
Сюда простые типы и указатели

Для указателей, кстати, логично как раз сделать отдельный метод с аргументом Т*, поскольку путаницы точно не возникнет, а польза чаще всего есть в том, что обработка указателей отличается от обычных типов (проверка валидности, удаление и т.п.)

 
Alexey Navoykov:

Код в одном месте, обсуждение в другом

Код вот:

template<typename T>
class A
 {
public:
  A* operator<<(T&p){ Print("<< &",typename(T)); return &this; }
  template<typename F>
  A* operator<<(F p){ Print("<< ",typename(F)); return &this; }
 };

На самом деле кроме этой записи есть ещё одно решение: перечислить поименно все простые типы, передаваемые по значению, а потом написать template метод с &, тогда ошибки тоже не возникнет. Этот вариант подходит для классов без собственной параметризации

 
Ilya Malev:

Если понимаешь, что модератор скорее всего сделал бы именно так - всегда лучше сделать это самому, не дожидаясь, пока это сделает модератор. Впрочем, обсуждение действий модераторов тоже не входит в любимое меню модераторов,поэтому будет лучше если мы его прекращаем.

Модератор бы точно не разорвал обсуждение по разным веткам.  Вы с таким рвением наверное готовы даже забанить себя, "не дожидаясь, пока это сделает модератор" ))
 
Ilya Malev:

Если понимаешь, что модератор скорее всего сделал бы именно так - всегда лучше сделать это самому, не дожидаясь, пока это сделает модератор. Впрочем, обсуждение действий модераторов тоже не входит в любимое меню модераторов,поэтому будет лучше если мы его прекращаем.

1. Всё же лучше сразу вести разговор о чём-либо там, где это "что-то-либо" находится, а не думать как бы сделал модератор. А то действительно всё расплылось по двум веткам, и теперь, даже если модератор решит, что обсуждение должно быть там-то, или там-то, то нормально перенести обсуждение с сохранением очерёдности постов и их смысла, является весьма трудоёмким занятием.

2. Обсуждение действий модератора - это не каждый чих... Это если начинается всеобщее и публичное оспаривание его действий, причём действий по наведению порядка или утихомириванию разбушевавшихся. А если у вас есть своё мнение, то кто ж вам его запрещает выразить? Может ваше мнение является весьма рациональным предложением, а вы боитесь его сказать, дабы не попасть под нелюбимое меню модератора? Так сиё чушь :)

Причина обращения: