Автогенератор класса кода из строки текста или какого-либо другого механизма

Я хотел бы иметь возможность автоматически генерировать класс в коде, если это возможно.

Я знаю, что у меня может быть текстовый файл или файл сценария, который можно открыть, и содержимое этого файла можно загрузить либо в вектор строк, либо в поток строк, и оттуда выполнить обратную запись в файл или набор файлов для генерации класса. , Меня не интересуют подробности анализа и это не то, что я на самом деле ищу.

Допустим, у меня есть текстовый файл, который выглядит примерно так: Мой текущий псевдофайл выше намного длиннее с более подробными подробными пояснениями; но здесь опущено для простоты. Если вы чувствуете, что это необходимо, не стесняйтесь спрашивать, и я опубликую это.

скрипт

// The finalized scripting file & its parser will not have any comments within code sections.
// Comments can be found before & after the <begin:file> & <end:file> sections

// This is the beginning of the file and whether or not a header and or cpp file
// is generated or not. If not then the idea is to generate the class in code directly.
// <begin:file "Foo.h"> // header only otherwise
// <being:file "Foo.h", "Foo.cpp"> for both header and cpp

<begin:file>
<class:"Foo">
<private:>
<variables: int=mX,mY,mZ float=mWidth,mHeight>
<public:>
<constructor:defualt=t, init=t>
<constructor:copy=t> // automatically generates both copy() & operator=() as = default;
<constructor:copy=f> // declares both copy() & operator() as = delete;
<destructor:default=t>
<end:class>
<end:file>

В приведенном выше сценарии, где я <begin:file> после него нет никаких строк; это означает, что я не хочу писать в файлы для создания заголовка и / или файла cpp. Поскольку они опущены, я хотел бы создать этот класс в коде.

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

В чем я не уверен, так это: допустим, я нахожусь в той части, где я читаю <class:"Foo"> это скажет моему парсеру, что я хочу class названный Foo и это будет оболочка

class Foo {};

Как и ожидалось, однако мы не можем написать окончание }; расстаться, потому что мы еще не достигли <end:class> часть. Так что на данный момент нам нужно выписать class Foo { и часть или проблема, которую я вижу здесь, я не знаю, как я мог бы взять текст или строку, такую ​​как std::string name("Foo");
и добавил, что после c++ ключевое слово class, Псевдо пример:

{
std::string name("Foo");

class name {
public:
int x;
};

std::cout << name << std::endl; // compiles and prints to the console "Foo"std::cout << name.y << std::end; // will not compile.
}

Проблема здесь в том, что после c++ключевое слово class он ожидает идентификатор, и компилятор не примет это. Компилятор объявит строку с именем name который имеет содержание "Foo", затем ниже, при попытке объявить класс с использованием этой строки, он не видит строку и имена для класса с именем идентификатора. Затем, если вы попытаетесь использовать класс впоследствии, он вообще не найдет класс, а скорее найдет строку с именем name. Можно ли использовать какую-то уже встроенную функцию для добавления необходимого текста здесь, чтобы автоматически генерировать класс в коде без необходимости его набирать? Я не уверен, как извлечь текст из строки, чтобы использовать его в качестве идентификатора имени класса.


Заключение

Из прочитанных комментариев и ответов, приведенных в моем связанном вопросе; Затем это подтверждает мои первоначальные предположения, которые я не упомянул, чтобы быть правдой. Это не может быть сделано. Это приводит к необходимости записи класса в соответствующие файлы с точки зрения синтаксического анализатора.

-1

Решение

Извините, но это не так, как работает C ++. Компилятор понимает такие вещи, как ключевое слово class и имена членов, и, как правило, использует все это понимание для преобразования всего этого в машинный код, который обычно использует только множество необработанных указателей и смещений, а не имена членов или подобные вещи. Только после того, как компилятор завершит работу, вы запустите свою программу, и типичная программа сама по себе совсем не содержит никаких возможностей для понимания таких вещей, как классы, имена членов или операторы присваивания.

Итак, какие у вас есть варианты? Вы могли бы написать некоторые утилиты, которые могли бы выполнять некоторые вещи, которые делал бы общий класс, но вы не сможете ссылаться на него так же, как класс, о котором узнал компилятор из файла заголовка в вашей программе. Это может выглядеть примерно так:

{
CustomClass myclass( "Foo.cls" );
CustomObject obj = myclass.create(); // default constructor
CustomObject obj_copy = obj; // copy constructor
}

Или вы можете сделать что-то, что компилирует и загружает плагины во время выполнения, хотя есть несколько сложностей при попытке сделать это. Это по-прежнему не позволяет использовать пользовательский класс, подобный классу, скомпилированному в вашу программу, но допускает произвольный код C ++ (который является одновременно мощным и опасным, поскольку кто-то может случайно или злонамеренно сломать что-либо таким образом). Это может включать преобразование файла конфигурации в фактический временный исходный файл C ++, который вы записываете, запуск компилятора со специальными параметрами для создания «разделяемой библиотеки» (Unix, включая Linux) или «DLL» (Windows), а затем загрузку этой библиотеки с использованием dlopen (многие версии Unix, включая Linux) или LoadLibrary (Windows). А для этапа компиляции это означает, что на любом компьютере, на котором вы запускаете вашу программу, требуется установленный компилятор, и, вероятно, она должна быть достаточно близкой к той версии компилятора, которую вы использовали для компиляции вашей программы. Если этот компилятор находится на специальном пути, как вашей программе будет указан этот путь?

Кроме того, вам необходимо разработать архитектуру плагинов, учитывая такие вещи, как:

  • Как плагин взаимодействует с программой? Предоставляет ли она функцию, которая просто вводит и выводит векторы строк? Предоставляет ли она функцию для создания объекта класса, производного от некоторого абстрактного базового класса?

  • Если плагину нужно использовать какие-либо базовые классы или специализированные функции, специфичные для вашей программы, как вы будете обеспечивать, чтобы необходимые файлы заголовков предоставлялись компилятору при компиляции плагина?

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector