2

我一直在阅读有关 Meta II 的文章,这让我想知道是否有 C++“代码生成器”。我寻找了一个 C++ Metacompiler,但这并不是我所指的。我指的是类似于宏在Assembly 中的工作方式。

为了澄清,我不是在谈论模板或定义。我也不是在谈论使用 IDE 为我生成代码。这不是一个理论问题,它对我非常有用。我正在从事需要访问代码的项目,并且我需要它是“我的”。使用 STL 中的函数会使事情变得更糟。当算法首次实施时,它还将在琐碎的任务上节省大量时间。

我说的是一个包含模板化代码片段数据库的工具,可以使用宏或可视 GUI 插入该数据库。这样,在基本框架建立之后,就可以对代码进行进一步的操作。

示例:我有一个对象队列。我想在该队列中找到某种类型的对象。会有一个可以插入的代码片段,它将自动生成一个函数(成员、静态、朋友......),它将遍历我的队列并寻找某些条件。与 IDE 不同,我不会提供参数或返回类型等详细信息。只会生成非常基本的内容。在这种情况下,可能是对成员的引用。它会给我一个原型和一个基本的函数定义。进一步的定制将需要手动完成。

在 C++ 中实现算法时,您必须将其转换为一些技术细节,甚至在您完成任何事情之前。而在软件工程中,这些技术性发挥了重要作用,而在简单的算法开发中它们却没有(KIS)。

更多细节:

添加示例。对不起,如果我没有说清楚。我不知道对我试图描述的某些功能使用什么术语(英语不是我的第一语言)。我应该包括一个例子。

这是主要思想:我有一个算法和它的伪代码。我正在寻找的工具将减少首次实现该伪代码的时间。只需几行代码或一个 GUI,C++ 编码的许多琐碎部分都将自动完成(如缩进、创建用于遍历的 for 循环、声明迭代器和临时变量等)。设计考虑将以标准方式完成(例如:返回指针或引用,使用迭代器或索引等......)。库将自动包含在内。生成的类、函数原型和函数定义将以标准方式分布在您的代码中。我并没有特别限制我的描述,但这是我在这种工具中寻找的东西。

这是一个简单的例子:

生成公式:

我想出了某种语言/宏作为例子。但任何类似的事情都会做。图例:# - 表示它是一个变量

class Time(int #day, string #name) //Create `class` Time with `int` day and string name
  getter getName #name //Create a member function to get name

main//Main
  vector Time #vec //Create vector of Time vec 
  input int #var1 //Input `int`
  find #var1 #day #vec //Find a member with day equal to var1 in vec
  printVector #vec  //Call print function for vector

function printVector(vector #par1) //Create void function printVector() to output names of Time instances
   output #par1 //Print member variables from vector

生成的代码:

自动变量、临时变量、迭代器或任何其他设计考虑因素的决策已经预定义。上面的代码至少需要一些思考才能提出“语言”,而我已经多次编写了下面的代码,以至于我什至没有“思考”。尽管如此,编写下面的代码还是花了很多很多的时间(而且它更容易包含难以发现的简单错误)。

#include <string>
#include <iostream>
#include <vector>
using namespace std;

//Create `class` Time with `int` day and string name
class Time
{
  int day;
  string name;

public:
  Time() {};
  Time(int par1, string par2) {day = par1; name = par2;}
  string getName() const {return name;} //Create a member function to get name
};

template<typename T> void printVector(vector<T>);

//Main
int main()
{
  vector<Time> vec; //Create vector of Time vec 
  int var1; cin>>var1; cin.ignore(); //Input `int` var1 (Default using iostream)

  //Find a member with day equal to var1 in vec (First found by default)
  vector<Time>::iterator it1; bool found = false;
  for(it1 = vec.begin(); (it1 != vec.end() && !found); found = (it1->day == var1), it1++);

  printVector(vec); //Call printVector

  return 0;
}

//Create void function printVector() to output name from vector
template<typename T>
void printVector(vector<T> par1)
{

  //Print member variables of instances from vector 
  vector<Time>::iterator it1;
  for(it1 = par1.begin(); it1 != par1.end(); it1++)
    cout<<it1->day<<" "<<it1->name; //Would cause an error since can't access, but generator doesn't know it!
}

希望我能更好地澄清我正在寻找的工具类型。我真的不明白为什么有些人对我想要的东西如此沮丧。我完全不同意它没有用。而且只要使用的语法保持在基本水平,我不明白为什么会有那么多兼容性问题。我正在考虑自己用 GUI 来做这件事。但由于它是一个如此简单的概念(没有什么比元编译器更接近),我相信已经有类似的东西了。

4

1 回答 1

5

您不太可能找到与您要求的完全一样的东西 - 代码重复(这是您提出的就地扩展模板方法将创建的)通常被认为是一件坏事,既因为它降低了代码的可理解性,又因为它提高了复制错误代码的可能性。通常建议使用 C++ 内置(非扩展)模板(和 STL) - 如果您遇到此类问题,您应该更清楚您的问题是什么,以便我们也可以提供帮助。

但是,如果您绝对必须有快捷方式模板,Eclipse 支持这样的东西。查看有关 Eclipse 代码模板的本教程。请注意,这些模板是纯字符串替换,并且有一定的限制。我强烈建议不要在这样的模板中包含任何类型的复杂逻辑。

于 2012-05-12T07:07:12.243 回答