掲示板一覧 - トピック一覧 EA ソースコード生成・コード生成テンプレート
C++テンプレートクラスを継承したときのソースコード自動生成・読み込み |
| フラット表示 | 前のトピック | 次のトピック |
| 投稿者 | トピック |
|---|---|
| sugimoto | 投稿日時: 2010-5-20 18:19 |
EA Administrator ![]() ![]() 投稿: 1895 |
C++テンプレートクラスを継承したときのソースコード自動生成・読み込み○ご質問
C++テンプレートクラスを継承したクラスのソースコードを自動生成し、 リバース後に、再度ソースコードを自動生成すると、おかしなコードが出力されます。 ○現象 (1)まずClass1の親クラスを指定する。 【追加設定】→【親クラスとインターフェースの指定】 【分類子】 【種類】【所有】【パッケージ】 Class2 実装 Yes システム std::vector<int> 実装 No <なし> ここで、std::vectorはモデル上に存在しない。 (2)ソースコード自動生成 この時点で出力されるソースコードは問題なし。 ------------------------------------------------------------------- class Class1 : public システム::Class2, public std::vector<int> { }; ------------------------------------------------------------------- (3)リバース リバース後に「親クラスとインターフェースの指定」ダイアログをみると、 以下のような設定になっている。 【分類子】 【種類】【所有】【パッケージ】 Class2 実装 Yes システム std::vector 実装 No <なし> (4)再度、ソースコード自動生成 ------------------------------------------------------------------- class Class1 : public システム::Class2<int>, public std::vector<int> { }; 【質問1】 上記(3)でstd::vectorの【分類子】で<int>の情報がなくなってしまっている。 リバース後も、【分類子】がstd::vector<int>にすることはできないでしょうか? 【質問2】 上記(4)で、システム::Class2に<int>が付いてしまう。 <int>が付かないようにすることはできないでしょうか? ○回答 まず、現状についてですが、ソースコード読み込みを行ったタイミングで、 Vecotor<int>のintは、クラス要素の情報として取り込まれるようになっています。 具体的には、クラス要素のプロパティ画面の「詳細」タブにある 「テンプレート」欄の一番下「引数」欄が該当します。 このように、親要素との関係ごとではなく、要素ごとに読み込まれるように なっておりますので、この後でソースコード生成を行いますと、その要素の 親要素にはすべて「引数」欄の情報(今回は<int>)が設定されるようになります。 いただきました【質問1】、【質問2】共に、このことが関係しています。 この対策についてですが、ソースコード生成ルールを変更することで 対応できる可能性がございます。 <int>は、コード生成テンプレートの「Class Base」テンプレート9行目で出力しています。 この出力条件を追加し、元となるクラス名にvectorが含まれる場合のみ、 <int>を出力するとすることで対応可能でしょうか? この場合、以下のようなカスタマイズになります。 [元テンプレート] 「Class Base」テンプレート 6行目~9行目 %classBaseName% %if classIsInstantiated == "T"% <%classArguments%> %endIf% [カスタマイズ後テンプレート] %classBaseName% %if classIsInstantiated == "T"% $find = %FIND(classBaseName, "vector")% %if $find != "-1"% <%classArguments%> %endIf% 上記のような内容で対応可能かご確認お願いいたします。 【質問1】 上記回答のように、現状は、int部分はクラス要素の情報として保持され、 std::vectorと表示されるようになっています。 【質問2】 上記回答のように、クラス要素として保持された情報が付加されるように なっております。コード生成テンプレートのカスタマイズにより、 対応可能かご確認いただければと思います。 ○ご質問(続き) 今回のケースではテンプレートのカスタマイズで対応できますが、 次のようなケースは、対策が難しいということでしょうか? class Class1 : public std::vector<int>, public std::list<long> { }; ○回答(続き) 現状は引数が複数ある場合には対応できておりませんので、 ご指摘どおり上記のような例の場合は、コード生成テンプレートの カスタマイズでは対応ができません。 なお、既存の機能ではありませんが、ソースコード読み込みルールを カスタマイズすることもできます。 このカスタマイズを利用し、ソースコード読み込み時にintやlongなどを クラス要素の情報として保存せずに、そのまま親クラスの情報として残す というカスタマイズを行ってみました。 このカスタマイズを利用しますと、上記のような場合でも、ソースコードの 読み込み→ソースコード生成を行った場合に不要に<int>が付加されることがなくなり、 またintやlongなど複数の引数を扱うことが可能になります。 このカスタマイズしたファイルでお試しいただけますでしょうか? ○ご報告 ソースコード読み込みのカスタマイズを利用することにより、 リバース時に【分類子】にstd::vector<int>が読み込まれるようになり、 リバース後のソースコード自動生成時にも最初の自動生成時と同じ内容が 出力されるようになったとのご報告を頂きました。 |
| フラット表示 | 前のトピック | 次のトピック |
| 題名 | 投稿者 | 日時 |
|---|---|---|
| » |
sugimoto | 2010-5-20 18:19 |




