Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.182.45] |
|
Страницы: (4) 1 [2] 3 4 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Цитата JoeUser @ Вопрос "что, зачем и какими силами" воспроизводится?! Хорошо, если упрощает, а несли нет???! А если это вааще не упало щяс??? Тут вот какое дело. Если для решения довольно простых задач (скажем, пресловутого конвертора строк в enum'ы) надо городить огород со сторонними утилитами - тут, эммм..., что-то не так в консерватории. В языке, в смысле. Метаклассы закрывают эту "дыру" и позволяют более гибко управлять процессом компиляции (в смысле, вмешиваться в работу компилятора) легальным способом получая нужные бенифиты. И это - здорово! Добавлено В любом случае: не попробуешь - не узнаешь. Вот я и хочу попробовать. Впрочем, уже сейчас (на этапе предварительного анализа подхода и реализации) вижу интересные вопросы, на которые в пропозале нет ответа... |
Сообщ.
#17
,
|
|
|
Да, а про constexpr я и забыл |
Сообщ.
#18
,
|
|
|
Вид метаклассов, близкий к финальному.
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; }; Осталось только интерпретатор всего этого хозяйства напедалить. |
Сообщ.
#19
,
|
|
|
Цитата Flex Ferrum @ Вид метаклассов, близкий к финальному. Это откуда инфа? Флекс, давай представим что метаклассы реализованы и самодостаточны. Приведи, пожалуйста, пример - где они "решают". Где реально без них содом и гомора? Чисто чтобы осознать глубину глубин. |
Сообщ.
#20
,
|
|
|
Цитата JoeUser @ Это откуда инфа? Это от меня. В рамках моей реализации. Ну а примеры... Вот, скажем, задачка с visitor'ом: // Базовый класс для 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 к виду, пригодному к обходу заданным визитором. |
Сообщ.
#21
,
|
|
|
Flex Ferrum, ты меня наталкиваешь на мысль, а-ля moc Qt. Сам посуди. С++ явно пока несовершенен. Берем язык сверхвысогого уровня (хотя можно и тот же C++), строим информационную модель, реализовываем ее в рамках языка программирования более низкого уровня. Профит!!!
Кстати! Некое подобие сказанного уже в стадии реализации - Haxe. Понимаю, все не так и не то. Но я говорю про концепцию. ИМХО право на жысть имеет. Добавлено ЗЫ: Чего действительно в haxe не хватает - так это ... увы мета |
Сообщ.
#22
,
|
|
|
Цитата JoeUser @ ты меня наталкиваешь на мысль, а-ля moc Qt. Сам посуди. С++ явно пока несовершенен. Берем язык сверхвысогого уровня (хотя можно и тот же C++), строим информационную модель, реализовываем ее в рамках языка программирования более низкого уровня. Профит!!! Ну, эммм... Именно это я и нацелился написать. Утилиту, которая внутри себя интерпретирует часть C++-текста и генерирует на его основе новый текст. То есть, скажем, результатом обработки кода из этого коммента: Метаклассы в C++ (сообщение #3775986) будет: class TestIface { public: virtual void TestMethod1() = 0; virtual std::string TestMethod2(int param) const = 0; }; Но это - самые простейшие преобразования. Можно добавить наследование от некоего IObject, скажем. Или сделать так, чтобы методы были преобразованы так: class TestIface { public: virtual result_t TestMethod1() nothrow = 0; virtual result_t TestMethod2(int param, std::string& returnVal) const nothrow = 0; }; Причём, замена одного другим может быть сделана в одном лишь месте - в определении метакласса. Добавлено Или, скажем, определяешь ты метакласс Component: template<typename ImplIfaces, typename RequireIfaces, typename HiddenIfaces = List<>> $class Component { // Реализацию сходу не напишу }; Потом пишешь: $Component<List<I1, I2>, List<I3, I4>> SomeComponent { //.. }; А он тебе генерирует: class SomeComponent : public I1, public I2, public ComponentBase { public: Component(I3*, I4*) {} enum {ComponentId = 0xffffff;} const std::string& GetComponentName() {return "SomeComponent";} // Реализация }; |
Сообщ.
#23
,
|
|
|
Цитата Flex Ferrum @ Ну, эммм... Именно это я и нацелился написать. Утилиту, которая внутри себя интерпретирует часть C++-текста и генерирует на его основе новый текст Хм Идея оч-оч интересная. Но не покидает ощущение де жа вю!!! Чисто про хронологии .... 1993 год. Прихожу я на фирму новичком. Сам из себя такой матеро-запаскалевший, ориентированный чисто объектно. За плечами asm-либа работы с окнами в режиме CGA/EGA/VGA, даже "снег" снимал на CGA на основе обратного хода луча ... А мне нач отдела заявляет - все херня, учи Clarion. Я туда, я сюда, да как так, да я ... проиграл я ему на простейшей задаче, вчистую!!! Сел и выучил посля Clarion. Чем интересен язык? Язык шаблонов шаблонов ... шаблонов. Каркас очередного модуля собирается единожды, определяются entry сниппетов, а вот там уже дальше ад и израиль. Если честно, по IDE клариона скучаю. 2018 год. Познакомился с языком шаблонов Blade. Тоже свой цымус. Понятко что, для чего, и как. Реализация приятная и красивая. Лично мое имховое резюме: я против усложнения Стандарта языка C++. Но я строго "за" за создание мета-систем генерации кода, реализации метасистем на основе паттернов проектирования. Вот как-то так |
Сообщ.
#24
,
|
|
|
Я для себя тоже такой язык нашёл - Jinja2. Даже его порт с питона на С++ сделал. Но... Мы должны пойти глубже.
|
Сообщ.
#25
,
|
|
|
Цитата Flex Ferrum @ Мы должны пойти глубже. ИМХО, нужно начинать с ТУ, делать ТЗ, и только потом прогать и докать сделанное. |
Сообщ.
#26
,
|
|
|
Цитата JoeUser @ Цитата Flex Ferrum @ Мы должны пойти глубже. ИМХО, нужно начинать с ТУ, делать ТЗ, и только потом прогать и докать сделанное. Так в первом посте ссылка на пропозал соответствующий. |
Сообщ.
#27
,
|
|
|
Не хотел я в первый релиз Jinja2 затаскивать макросы. Но без них будет определённо тоскливо...
А такого меташаблонного кода в реализации автопрограммиста будет в достатке... |
Сообщ.
#28
,
|
|
|
Цитата Flex Ferrum @ в прошлом году на конфах некто Герб Саттер взорвал C++-общественность докладами про метаклассы Это те метаклассы, которые, как минимум в CLOS с 1994-го? Да и в Qt они вроде давно есть. В чём взрыв-то? |
Сообщ.
#29
,
|
|
|
Цитата korvin @ Это те метаклассы, которые, как минимум в CLOS с 1994-го? Да и в Qt они вроде давно есть. В чём взрыв-то? Про CLOS не в курсе, а в Qt я про такое не слышал. |
Сообщ.
#30
,
|
|
|
В общем, оно начинает потихоньку дышать:
Для: 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; }; На консоли можно увидеть: ### 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. |