2

私はMetaIIについて読んでいますが、C++の「コードジェネレーター」があるのではないかと思いました。私はC++メタコンパイラを探しましたが、それは私が言及しているものとは正確には異なります。私が言及しているのは、アセンブリでマクロがどのように機能するかに似ています。

明確にするために、私はテンプレートや定義について話しているのではありません。また、IDEを使用してコードを生成することについても話していません。これは理論上の問題ではなく、私にとって非常に役立ちます。私はコードにアクセスする必要があるプロジェクトに取り組んでおり、それは「私のもの」である必要があります。STLの関数を使用すると、事態は何度も最悪になります。また、アルゴリズムが最初に実装されるときに、些細なタスクで多くの時間を節約できます。

私は、マクロまたはビジュアルGUIのいずれかを使用して挿入できるテンプレート化されたコードスニペットのデータベースを含むツールについて話しています。そうすれば、基本的なフレームワークを設定した後で、コードをさらに操作できます。

例:オブジェクトのキューがあります。そのキュー内で特定のタイプのオブジェクトを見つけたい。挿入できるコードスニペットがあり、キューをトラバースして特定の条件を探す関数(member、static、friend ...)を自動的に生成します。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 に答える