8

新しいC++クラスをいくつかのかなり厄介なコーディング規則に準拠させるために(前もって:私はこれらについて議論する立場にありません...)、私は新しいC++クラスのスタブを生成する方法を考えていました。現在、誰もがコピー&ペーストを行っており、定期的に詳細が欠落しています。使用しているIDEはMSVisualStudio 2005ですが、これらのトピックに関しては、2008年と2010年に大きな変更はなかったと思います。

私の最初のアイデアは、これを行うためのコマンドラインスクリプトを実装することでした。これは非常に簡単です。あるいは、IDE統合を改善するためにデフォルトのVS拡張メカニズムを使用することを考えました。したがって、フィルター(ソリューションエクスプローラー)で[追加]- > [新しいアイテム... ]を選択すると、カスタムのものがフックされます。

調査の結果、使いやすいテンプレートメカニズムがあることがわかりました。これは、残念ながらC ++では機能しません(http://msdn.microsoft.com/en-us/library/6db0hwky%28v=vs.80% 29.aspx)。C ++の場合、代わりにカスタムウィザードを実装して、レイアウトにhtmlを、ロジックにjavascriptを組み込む必要があるようです。

カスタムウィザードのアプローチに関しては、これを行うには(少なくとも私にとっては)ある程度の努力が必要であるという結論に達しました。MSDNは、このトピックについてあまり詳しく説明していません。プロジェクト専用のカスタムウィザードを扱っているいくつかのウォークスルーをWebで見つけました( [追加]- >[新しいアイテム... ]ではなく[追加]- >[新しいプロジェクト... ])。

だから、ここにqnがあります:これまたは同様のことをした人はいますか?それは(より良いIDE統合)努力する価値がありますか(カスタムウィザードの実装の詳細に対処する)、または代わりにコマンドラインツールを使用することをお勧めしますか?現在のプロジェクトでは、2日以上の作業は報われないと思います。

カスタムウィザードが優れていると思われる場合は、開始するためのヒントをいくつか提供できるかもしれません。また、私が思いつかなかった代替案があるかもしれません。VSアドインはこれを上回っているようで、VC \ vcprojectitems \ newc++file.cppなどを適応させることはできません。

よろしくお願いします...ジャーブ

4

1 に答える 1

13

カスタムウィザードを使用して同様のことを行いました。

私の目的のために、単純なマクロを各クラスに挿入して、それを静的ファクトリ オブジェクトに挿入したかっただけです。

実際のウィザードを変更する必要はありませんでした。デフォルトのジェネリック クラス ウィザードをコピーし、コード生成 JavaScript を変更しただけです。

このトピックに関するドキュメントはくだらないですが、JavaScript を始めるのに適した場所は次のとおりです (ここで最も力を発揮します)。

http://msdn.microsoft.com/en-us/library/t41260xs(v=VS.71).aspx

デフォルトのクラス ウィザードの JavaScript は次の場所にあります。

C:\Program Files\Microsoft Visual Studio 10.0\VC\VCWizards\CodeWiz\Generic\Class\Scripts\1033\default.js


プロジェクトの複製

これを複製するのは思ったより難しいです。コピーして貼り付ける必要があります

Microsoft Visual Studio 10.0\VC\VCWizards\CodeWiz\Generic\

フォルダーに移動してから、次の場所に移動します。

C:\Program Files\Microsoft Visual Studio 10.0\VC\VCAddClass\Generic

このフォルダーを複製し、その中の Generic.vsdir を変更して、..\Simple.vsz (VCAddClass フォルダー内のファイル) の複製を指すようにします。

Simple.vsz ファイルは、最初にコピーした VCWizards の "Generic" フォルダーの場所を指しているので、新しい simple.vsz をその場所に向けます。


コード生成

実際のコード生成に関しては、理解するのはそれほど難しくありません。物事をより迅速に開始するために、default.js の一般的な動作を次に示します。

ウィザードが完了すると、コード生成メソッドが次から開始されます。

function OnFinish(selProj, selObj)

selProj は (私が知る限り) EnvDTE.Project のインスタンスです。

http://msdn.microsoft.com/en-us/library/envdte.project.aspx

ウィザードからの情報の取得は、次のことに基づいているようです。

wizard.FindSymbol("CLASS_NAME")

本当の魔法が selProj.CodeModel オブジェクトで起こり始めます

oCM.AddClass(strClassName, strHeader, vsCMAddPositionEnd, "", "", vsCMAccessDefault);

これらのメソッドがファイルに何かを追加するための規則は、ファイルパスをパラメーターとして必要とするため、ファイルを単一のアクションとして変更するだけのようです。

これは CodeClass インスタンスを返し、次のようなメソッドによって追加できます。

AddAttribute
AddFunction
...

非常に厳密なコード形式を探している場合 (または私の場合、通常のコード構文に適合しないマクロを挿入する場合)、これは非常に制限的です。

これを回避する簡単な方法は、EditPoint インターフェイスを使用して完全に制御する必要がある部分の文字列を独自に作成することです。

EditPoint は、次のようなメソッドを呼び出すことができるコード ファイル内の場所です。

EditPoint.Insert(string)
Editpoint.InsertFromFile(path)

コードを挿入する場所で EditPoint を取得するには、コード生成ファイル (クラスやコンストラクターなど) 内の既存のアイテムの 1 つの場所を使用し、.StartPointOf または .EndPointOf を使用してパラメーターを操作して TextPoint を取得します。 .

TextPoint を取得したら、次のように EditPoint を作成できます。

newclass.EndPointOf(vsCMPartBody).CreateEditPoint().Insert("\nprivate:\n  REGISTER_TYPE_MEMBER("+strClassName+");\n");

代わりに .cpp ファイル内の TextPoint を取得するには:

oConstructor.StartPointOf(vsCMPartWhole,vsCMWhereDefinition).CreateEditPoint().Insert("REGISTER_TYPE_BODY_ID("+strClassName+",REPLACE_ID);\n\n\n");

これにより、ウィザードを介して必要な入力データを見つけることができる限り、JScript 文字列操作を介して必要なことを何でも行うことができます (これについてはまだ掘り下げていません)。

于 2011-10-27T07:08:45.217 に答える