На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
Страницы: (4) 1 [2] 3 4  все  ( Перейти к последнему сообщению )  
> Метаклассы в C++ , Мечта или реальность?
    Цитата JoeUser @
    Вопрос "что, зачем и какими силами" воспроизводится?!
    Хорошо, если упрощает, а несли нет???!
    А если это вааще не упало щяс???

    Тут вот какое дело. Если для решения довольно простых задач (скажем, пресловутого конвертора строк в enum'ы) надо городить огород со сторонними утилитами - тут, эммм..., что-то не так в консерватории. В языке, в смысле. Метаклассы закрывают эту "дыру" и позволяют более гибко управлять процессом компиляции (в смысле, вмешиваться в работу компилятора) легальным способом получая нужные бенифиты. И это - здорово!

    Добавлено
    В любом случае: не попробуешь - не узнаешь. Вот я и хочу попробовать. Впрочем, уже сейчас (на этапе предварительного анализа подхода и реализации) вижу интересные вопросы, на которые в пропозале нет ответа...
      Цитата Qraizer @
      Вообще без напряга. Там переполнения после 47-го элемента, естественно, не суть.

      Да, а про constexpr я и забыл :blush:
        Вид метаклассов, близкий к финальному.
        ExpandedWrap disabled
          METACLASS_DECL(Interface)
          {
              static void GenerateDecl()
              {
                  compiler.require($Interface.variables().empty(), "Interface may not contain data members");
           
                  for (auto& f : $Interface.functions())
                  {
                      compiler.require(!f.is_copy() && !f.is_move(), "Interface can't contain copy or move constructor");
                      if (!f.has_access())
                          f.make_public();
           
                      compiler.require(f.is_public(), "Inteface function must be public");
                      f.make_pure_virtual();
                  }
              }
          };
           
          METACLASS_INST(Interface, TestIface)
          {
          public:
              void TestMethod1();
              std::string TestMethod2(int param) const;
          };

        Осталось только интерпретатор всего этого хозяйства напедалить.
          Цитата Flex Ferrum @
          Вид метаклассов, близкий к финальному.

          Это откуда инфа?
          Флекс, давай представим что метаклассы реализованы и самодостаточны. Приведи, пожалуйста, пример - где они "решают". Где реально без них содом и гомора? Чисто чтобы осознать глубину глубин.
            Цитата JoeUser @
            Это откуда инфа?

            Это от меня. В рамках моей реализации. :) Ну а примеры... Вот, скажем, задачка с visitor'ом:
            ExpandedWrap disabled
              // Базовый класс для visitable-классов
              template<typename V, typename R = void>
              struct VisitableBase
              {
                  virtual R Visit(V* v) = 0;
              };
               
              template<typename V, typename R = void>
              $class Visitable
              {
                  constexpr
                  {
                       // Добавляем метод Visit в визитируемый класс
                       -> R Visit(V* v) override {return v->Visit(*this);}
               
                       // Добавляем наследование
                       $Visitable.add_parent(VisitableBase<V, R>);
                  }
              };
               
              class SampleVisitor;
              Visitable<SampleVisitor> Foo
              {
              public:
              // Тут ничего лишнего не пишем
              };
               
              Visitable<SampleVisitor> Bar
              {
              public:
              // Тут ничего лишнего не пишем
              };
               
              // Объявляем класс-визитор
              class SampleVisitor
              {
              public:
                  void Visit(const Foo&) {std::cout << "SampleVisitor::Visit(Foo)\n";}
                  void Visit(const Bar&) {std::cout << "SampleVisitor::Visit(Bar)\n";}
              };


            В данном случае метакласс Visitable приведёт объявления классов Foo и Bar к виду, пригодному к обходу заданным визитором.
              Flex Ferrum, ты меня наталкиваешь на мысль, а-ля moc Qt. Сам посуди. С++ явно пока несовершенен. Берем язык сверхвысогого уровня (хотя можно и тот же C++), строим информационную модель, реализовываем ее в рамках языка программирования более низкого уровня. Профит!!!

              Кстати! Некое подобие сказанного уже в стадии реализации - Haxe. Понимаю, все не так и не то. Но я говорю про концепцию. ИМХО право на жысть имеет.

              Добавлено
              ЗЫ: Чего действительно в haxe не хватает - так это ... увы мета :-?
                Цитата JoeUser @
                ты меня наталкиваешь на мысль, а-ля moc Qt. Сам посуди. С++ явно пока несовершенен. Берем язык сверхвысогого уровня (хотя можно и тот же C++), строим информационную модель, реализовываем ее в рамках языка программирования более низкого уровня. Профит!!!

                Ну, эммм... Именно это я и нацелился написать. Утилиту, которая внутри себя интерпретирует часть C++-текста и генерирует на его основе новый текст. То есть, скажем, результатом обработки кода из этого коммента: Метаклассы в C++ (сообщение #3775986) будет:
                ExpandedWrap disabled
                  class TestIface
                  {
                  public:
                      virtual void TestMethod1() = 0;
                      virtual std::string TestMethod2(int param) const = 0;
                  };

                Но это - самые простейшие преобразования. Можно добавить наследование от некоего IObject, скажем. Или сделать так, чтобы методы были преобразованы так:
                ExpandedWrap disabled
                  class TestIface
                  {
                  public:
                      virtual result_t TestMethod1() nothrow = 0;
                      virtual result_t TestMethod2(int param, std::string& returnVal) const nothrow = 0;
                  };

                Причём, замена одного другим может быть сделана в одном лишь месте - в определении метакласса.

                Добавлено
                Или, скажем, определяешь ты метакласс Component:
                ExpandedWrap disabled
                  template<typename ImplIfaces, typename RequireIfaces, typename HiddenIfaces = List<>>
                  $class Component
                  {
                  // Реализацию сходу не напишу
                  };

                Потом пишешь:
                ExpandedWrap disabled
                  $Component<List<I1, I2>, List<I3, I4>> SomeComponent
                  {
                  //..
                  };

                А он тебе генерирует:
                ExpandedWrap disabled
                  class SomeComponent : public I1, public I2, public ComponentBase
                  {
                  public:
                      Component(I3*, I4*) {}
                   
                      enum {ComponentId = 0xffffff;}
                      const std::string& GetComponentName() {return "SomeComponent";}
                      
                      // Реализация
                  };
                Сообщение отредактировано: Flex Ferrum -
                  Цитата Flex Ferrum @
                  Ну, эммм... Именно это я и нацелился написать. Утилиту, которая внутри себя интерпретирует часть C++-текста и генерирует на его основе новый текст

                  Хм :scratch: Идея оч-оч интересная. Но не покидает ощущение де жа вю!!!

                  Чисто про хронологии ....

                  1993 год. Прихожу я на фирму новичком. Сам из себя такой матеро-запаскалевший, ориентированный чисто объектно. За плечами asm-либа работы с окнами в режиме CGA/EGA/VGA, даже "снег" снимал на CGA на основе обратного хода луча ... А мне нач отдела заявляет - все херня, учи Clarion. Я туда, я сюда, да как так, да я ... проиграл я ему на простейшей задаче, вчистую!!! Сел и выучил посля Clarion.

                  Чем интересен язык? Язык шаблонов шаблонов ... шаблонов. Каркас очередного модуля собирается единожды, определяются entry сниппетов, а вот там уже дальше ад и израиль. Если честно, по IDE клариона скучаю.

                  2018 год. Познакомился с языком шаблонов Blade. Тоже свой цымус. Понятко что, для чего, и как. Реализация приятная и красивая.

                  Лично мое имховое резюме: я против усложнения Стандарта языка C++. Но я строго "за" за создание мета-систем генерации кода, реализации метасистем на основе паттернов проектирования. Вот как-то так :-?
                    Я для себя тоже такой язык нашёл - Jinja2. Даже его порт с питона на С++ сделал. Но... Мы должны пойти глубже. :)
                      Цитата Flex Ferrum @
                      Мы должны пойти глубже.

                      ИМХО, нужно начинать с ТУ, делать ТЗ, и только потом прогать и докать сделанное.
                        Цитата JoeUser @
                        Цитата Flex Ferrum @
                        Мы должны пойти глубже.

                        ИМХО, нужно начинать с ТУ, делать ТЗ, и только потом прогать и докать сделанное.

                        Так в первом посте ссылка на пропозал соответствующий. :)
                          Не хотел я в первый релиз Jinja2 затаскивать макросы. Но без них будет определённо тоскливо...
                          user posted image

                          А такого меташаблонного кода в реализации автопрограммиста будет в достатке...
                            Цитата Flex Ferrum @
                            в прошлом году на конфах некто Герб Саттер взорвал C++-общественность докладами про метаклассы

                            Это те метаклассы, которые, как минимум в CLOS с 1994-го? Да и в Qt они вроде давно есть. В чём взрыв-то?
                              Цитата korvin @
                              Это те метаклассы, которые, как минимум в CLOS с 1994-го? Да и в Qt они вроде давно есть. В чём взрыв-то?

                              Про CLOS не в курсе, а в Qt я про такое не слышал.
                                В общем, оно начинает потихоньку дышать:
                                Для:
                                ExpandedWrap disabled
                                  METACLASS_DECL(Interface)
                                  {
                                      static void GenerateDecl()
                                      {
                                          compiler.message("Hello world from metaprogrammer!");
                                          compiler.require($Interface.variables().empty(), "Interface may not contain data members");
                                   
                                          for (auto& f : $Interface.functions())
                                          {
                                              compiler.require(f.is_implicit() || (!f.is_copy_ctor() && !f.is_move_ctor()), "Interface can't contain copy or move constructor");
                                              if (!f.has_access())
                                                  f.make_public();
                                   
                                              compiler.require(f.is_public(), "Inteface function must be public");
                                              f.make_pure_virtual();
                                          }
                                      }
                                   
                                   
                                      static int GenerateImpl()
                                      {
                                          int a = 0;
                                          return a + 2;
                                      }
                                  };
                                   
                                  METACLASS_INST(Interface, TestIface)
                                  {
                                  public:
                                      void TestMethod1();
                                      std::string TestMethod2(int param) const;
                                  };
                                   
                                  METACLASS_INST(Interface, BadTestIface)
                                  {
                                  public:
                                      void TestMethod1();
                                      std::string TestMethod2(int param) const;
                                   
                                  private:
                                      int m_val;
                                  };

                                На консоли можно увидеть:
                                ExpandedWrap disabled
                                  ### Trying to call 'meta::CompilerImpl::message/void message(const char *msg)'
                                  ###### Hello world from metaprogrammer!
                                  ### Trying to call 'meta::CompilerImpl::require/void require(bool, const char *message)'
                                  ...
                                  ### Trying to call 'meta::CompilerImpl::message/void message(const char *msg)'
                                  ###### Hello world from metaprogrammer!
                                  ### Trying to call 'meta::CompilerImpl::require/void require(bool, const char *message)'
                                  ###### Interface may not contain data members


                                Добавлено
                                Теперь борюсь с range-for.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 [2] 3 4  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0463 ]   [ 17 queries used ]   [ Generated: 28.03.24, 12:35 GMT ]