На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 168 169 [170] 171 172 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата korvin @
    а разве перекрытие виртуального метода стало чем-то необычным, что компилятор должен возмущаться?

    Он перекрыл виртуальный метод обычным (в Delphi они называются статическими). Если именно перекрытие, то нужно указать override.
      Цитата Romkin @
      Да, а что, в С++ разве нельзя объявить что-то вроде
      ExpandedWrap disabled
        type
          TA = (X, Y);
          TB = (A,B,C,D);
          TMethodArray = array [TA]of array [TB] of TMethod; //двумерный, обращение типа MA[X][C] или MA[X,C]

      вот я и спрашивал в своем первом сегодняшнем сообщении, как объявить массив, т.е. что передать в качестве размерностей -- имена перечислений или (последний_элемент + 1)? или вообще по-другому нужно?
        Цитата korvin @
        как я понимаю сам массив и процедуру инициализации объявить статичными, но где лучше всего прописать вызов этой процедуры?

        Если статичными, то методы же не смогут быть виртуальными. Это не требуется?
          Цитата Romkin @
          Если статичными, то методы же не смогут быть виртуальными.

          э-м... хз. но в общем-то и не требуется.
            Цитата korvin @
            что передать в качестве размерностей -- имена перечислений или (последний_элемент + 1)? или вообще по-другому нужно?

            Можно последний элемент + 1(или сделать последним элементом перечисления ИМЯ_COUNT). Но вообще решение не универсальное и не красивое.
            Поддерживаю Игоря.
              Цитата D_KEY @
              Но вообще решение не универсальное

              мне и не нужно универсальное, мне нужно простое и читабельное.

              Цитата D_KEY @
              и не красивое.

              ну не образец красоты, да, но для моих требований вполне достаточное, не вижу какую большую красоту тут предоставили бы map с pair, которые предлагал Игорь
              Сообщение отредактировано: korvin -
                Прям не знаю, что будет с korvin'ом, но всё же покажу этот ужас :)
                ExpandedWrap disabled
                  #include <iostream>
                  #include <map>
                   
                  //gee.hpp
                  enum Foo {X, Y};
                  enum Bar {A, B, C, D};
                   
                  class Gee {
                  private:
                      Foo f;
                      Bar b;
                   
                      void mXA ();
                      void mXB ();
                      void mXC ();
                      void mXD ();
                      void mYA ();
                      void mYB ();
                      void mYC ();
                      void mYD ();
                   
                      struct Initializer
                      {
                        Initializer();
                      };
                   
                      static Initializer init;
                      typedef void (Gee::*handler)();
                      typedef std::pair<Foo, Bar> key;
                      static std::map<key, handler>* dispatcher;
                   
                  public:
                      void dispatch ();
                  };
                  ////
                   
                  //gee.cpp
                  Gee::Initializer::Initializer()
                  {
                    dispatcher = new std::map<key, handler>();
                    (*dispatcher)[std::make_pair(X, A)] = &Gee::mXA;
                  }
                   
                  Gee::Initializer Gee::init;
                  std::map<Gee::key, Gee::handler>* Gee::dispatcher;
                   
                  void Gee::dispatch() { (this->*(*dispatcher)[std::make_pair(X, A)])(); }
                  void Gee::mXA() { std::cout << "XA" << std::endl; }
                  ////
                   
                  int main()
                  {
                    Gee gee;
                    gee.dispatch();
                  }

                ExpandedWrap disabled
                  XA

                Если так не нравится map - замените на массив. Вся инициализация в Gee::Initializer::Initializer.
                  Цитата MyNameIsIgor @
                  Если так не нравится map - замените на массив.

                  да, именно так я пожалуй и поступлю =)
                    Цитата korvin @
                    да, именно так я пожалуй и поступлю =)

                    Поверьте, читабельность лишь ухудшится ;)
                      Цитата korvin @
                      лезть ради такой простой вещи в букварь как-то тупо, тем более когда есть более простые решения.

                      тупо? букварь надо знать
                      просто? это тот пример, что тебе привели простой?
                      писать руками то, что может сделать компилятор, наверное я что-то в этой жизни не понимаю...
                        korvin, если простое и читабельное, то нечто подобное Дельфийному варианту Shaggy-а и у меня в голове варилось. Только не на динамических методах, а на простых массивах указателей на функции. Но это если задача на раз. Если на много разов, нужно думать в первую очередь о перспективе долгосрочной эксплуатации паттерна в разных проектах, и тут читабельность реализации уходит далеко на задний план в угоду читабельности использования. Тут я за MyNameIsIgor-я.
                        Есть ещё мысли касательно variadic templates и статического полиморфизма, надо ж потихонечну новые фичи пощупывать, но пока не буду пробовать, не на чем ещё компилить.
                          Цитата MyNameIsIgor @
                          Поверьте, читабельность лишь ухудшится ;)

                          по твоему примеру я вижу, что нет

                          Добавлено
                          Цитата Shaggy @
                          тупо? букварь надо знать

                          мне ни разу на практике не приходилось сталкиваться с message, может он не нужен? =)
                            Цитата korvin @
                            по твоему примеру я вижу, что нет

                            Так покажите, что получилось - мне аж интересно :)
                              ExpandedWrap disabled
                                enum Foo { A,B,C}
                                enum Bar { X,Y }
                                 
                                class Gee
                                {
                                    public Foo f;
                                    public Bar b;
                                    
                                    void AX(){"AX".Dump();}
                                    void BY(){"BY".Dump();}
                                    //... остальные
                                 
                                    public void Dispatch()
                                    {
                                        var methodName = f.ToString()+b.ToString();    
                                        GetType().InvokeMember(methodName, BindingFlags.InvokeMethod | BindingFlags.NonPublic  |BindingFlags.Instance,Type.DefaultBinder,this,new object[]{});
                                    }
                                    
                                }
                                 
                                 
                                void Main()
                                {
                                    var g = new Gee(){f=Foo.B,b=Bar.X};
                                    
                                    g.Dispatch();
                                }
                                Цитата IL_Agent @
                                ExpandedWrap disabled
                                  enum Foo { A,B,C}
                                  enum Bar { X,Y }
                                   
                                  class Gee
                                  {
                                      public Foo f;
                                      public Bar b;
                                      
                                      void AX(){"AX".Dump();}
                                      void BY(){"BY".Dump();}
                                      //... остальные
                                   
                                      public void Dispatch()
                                      {
                                          var methodName = f.ToString()+b.ToString();    
                                          GetType().InvokeMember(methodName, BindingFlags.InvokeMethod | BindingFlags.NonPublic  |BindingFlags.Instance,Type.DefaultBinder,this,new object[]{});
                                      }
                                      
                                  }
                                   
                                   
                                  void Main()
                                  {
                                      var g = new Gee(){f=Foo.B,b=Bar.X};
                                      
                                      g.Dispatch();
                                  }

                                хреновая магия, имхо =)

                                Добавлено
                                Цитата MyNameIsIgor @
                                Так покажите, что получилось - мне аж интересно :)

                                ExpandedWrap disabled
                                  #include <iostream>
                                   
                                  //gee.hpp
                                  enum Foo {X, Y};
                                  enum Bar {A, B, C, D};
                                   
                                  class Gee {
                                  public:
                                      typedef void (Gee::*proc)();
                                      void dispatch ();
                                   
                                  private:
                                      Foo f;
                                      Bar b;
                                   
                                      void mXA ();
                                      void mXB ();
                                      void mXC ();
                                      void mXD ();
                                      void mYA ();
                                      void mYB ();
                                      void mYC ();
                                      void mYD ();
                                      
                                      struct Initializer {
                                          Initializer();
                                      };
                                      
                                      static proc mt[Y+1][D+1];
                                      static Initializer init;
                                  };
                                  ////
                                   
                                  //gee.cpp
                                  Gee::Initializer::Initializer ()
                                  {
                                      mt[X][A] = &Gee::mXA;
                                  }
                                   
                                  Gee::Initializer Gee::init;
                                  Gee::proc Gee::mt[Y+1][D+1];
                                   
                                  void Gee::dispatch () { (this->*mt[X][A])(); }
                                   
                                  void Gee::mXA () { std::cout << "XA" << std::endl; }
                                  ////
                                   
                                  int main ()
                                  {
                                      Gee gee;
                                      gee.dispatch();
                                  }

                                единственный минус -- отсутствие возможности параметризовать типы-массивы перечислением, как в паскале множествами =(
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 168 169 [170] 171 172 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.2668 ]   [ 14 queries used ]   [ Generated: 31.07.26, 17:01 GMT ]