【发布时间】:2018-08-16 04:23:53
【问题描述】:
如果可能的话,我希望能够在代码中自动生成一个类。
我知道我可以打开一个文本或脚本文件,并将该文件的内容加载到字符串向量或字符串流中,然后从那里写回一个文件或一组文件以生成一个类。我对解析方面的细节不感兴趣,这不是我真正想要的。
假设我有一个看起来像这样的文本文件:我上面的当前伪文件更长,并且有更详细的解释;但为简单起见,此处省略。如果您觉得需要,请不要犹豫,我会发布。
脚本
// 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"> 中阅读的部分,这将告诉我的解析器我想要一个名为Foo 的class,这将是它的外壳:
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 的字符串。是否可以使用某种已经内置的功能在此处附加所需的文本以在代码中自动生成一个类而无需输入它?我不确定如何从字符串中提取文本以将其用作类名称的标识符。
结论
通过阅读我的相关问题中提供的 cmets 和答案;然后它证明了我最初没有提到的假设是正确的。这是不可能的。从解析器的角度来看,这确实不得不将类写入它们各自的文件。
【问题讨论】:
-
"这里的问题是在关键字之后..." 不清楚。这是您正在解析自己的类似 xml 的文件的人。与编译器无关。
-
@liliscent 那是我遇到问题的部分;我不知道如何从字符串中提取文本以将其用作类名的标识符。
-
也许可以复习一些解析技术(这个案例很基础)...
-
@liliscent 这不是解析部分的问题;它在 c++ 本身内。如果我在 while 循环或递归函数中,并且我想自动生成一个使用字符串中的文本作为其标识符的类的部分;这就是我不知道该怎么做。我在网上搜索过,但找不到太多可以帮助我的东西。
-
不,它与 C++ 无关。您想从自己的格式生成 C++ 源代码。无论哪种语言都可以完成这项任务,例如 Python。这里 C++ 不是一种编程语言,它是一些文本。
标签: c++ class templates code-generation auto-generate