掲示板一覧   -   トピック一覧
   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>が読み込まれるようになり、
リバース後のソースコード自動生成時にも最初の自動生成時と同じ内容が
出力されるようになったとのご報告を頂きました。
フラット表示 前のトピック | 次のトピック

題名 投稿者 日時
 » C++テンプレートクラスを継承したときのソースコード自動生成・読み込み sugimoto 2010-5-20 18:19