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

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

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

Да, а про constexpr я и забыл :blush:
Мои программные ништякиhttp://majestio.info
Вид метаклассов, близкий к финальному.
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;
    };

Осталось только интерпретатор всего этого хозяйства напедалить.
"Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
Морган Фриман
Реализация шаблонов Jinja2 для C++ Jinja2 C++
Цитата Flex Ferrum @
Вид метаклассов, близкий к финальному.

Это откуда инфа?
Флекс, давай представим что метаклассы реализованы и самодостаточны. Приведи, пожалуйста, пример - где они "решают". Где реально без них содом и гомора? Чисто чтобы осознать глубину глубин.
Мои программные ништякиhttp://majestio.info
Цитата 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 к виду, пригодному к обходу заданным визитором.
"Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
Морган Фриман
Реализация шаблонов Jinja2 для C++ Jinja2 C++
Flex Ferrum, ты меня наталкиваешь на мысль, а-ля moc Qt. Сам посуди. С++ явно пока несовершенен. Берем язык сверхвысогого уровня (хотя можно и тот же C++), строим информационную модель, реализовываем ее в рамках языка программирования более низкого уровня. Профит!!!

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

Добавлено
ЗЫ: Чего действительно в haxe не хватает - так это ... увы мета :-?
Мои программные ништякиhttp://majestio.info
Цитата 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 -
"Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
Морган Фриман
Реализация шаблонов Jinja2 для C++ Jinja2 C++
Цитата Flex Ferrum @
Ну, эммм... Именно это я и нацелился написать. Утилиту, которая внутри себя интерпретирует часть C++-текста и генерирует на его основе новый текст

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

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

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

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

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

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

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

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

Так в первом посте ссылка на пропозал соответствующий. :)
"Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
Морган Фриман
Реализация шаблонов Jinja2 для C++ Jinja2 C++
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1385 ]   [ 20 queries used ]   [ Generated: 15.08.18, 03:40 GMT ]