dbx は C++ テンプレートをサポートしています。 クラスおよび関数テンプレートを 含むプログラムを dbx に読み込み、クラスや関数に対して使用する任意の dbx コマンドをテンプレートに対して次のように呼び出すことができます。
クラスまたは関数テンプレートのインスタンス化にブレークポイントを設定する (「stop inclass classname コマンド」、「stop infunction name コマンド」、「stop in function コマンド」 参照)
すべてのクラスおよび関数テンプレートのインスタンス化のリストを出力する (「whereis name コマンド」参照)
テンプレートおよびインスタンスの定義を表示する (「whatis name コマンド」参照)
メンバーテンプレート関数と関数テンプレートのインスタンス化を呼び出す (「call function_name( parameters) コマンド」参照)
関数テンプレートのインスタンス化の値を出力する (「print コマンド」参照)
関数テンプレートのインスタンス化のソースコードを表示する (「list コマンド」参照)
次のコード例は、クラステンプレート Array とそのインスタンス化、および関数テンプレート square とそのインスタンス化を示しています。
1 template<class C> void square(C num, C *result) 2 { 3 *result = num * num; 4 } 5 6 template<class T> class Array 7 { 8 public: 9 int getlength(void) 10 { 11 return length; 12 } 13 14 T & operator[](int i) 15 { 16 return array[i]; 17 } 18 19 Array(int l) 20 { 21 length = l; 22 array = new T[length]; 23 } 24 25 ~Array(void) 26 { 27 delete [] array; 28 } 29 30 private: 31 int length; 32 T *array; 33 }; 34 35 int main(void) 36 { 37 int i, j = 3; 38 square(j, &i); 39 40 double d, e = 4.1; 41 square(e, &d); 42 43 Array<int> iarray(5); 44 for (i = 0; i < iarray.getlength(); ++i) 45 { 46 iarray[i] = i; 47 } 48 49 Array<double> darray(5); 50 for (i = 0; i < darray.getlength(); ++i) 51 { 52 darray[i] = i * 2.1; 53 } 54 55 return 0; 56 } |
この例の内容は次のとおりです。
Array はクラステンプレート
square は関数テンプレート
Array<int> はクラステンプレートインスタンス化 (テンプレートクラス)
Array<int>::getlength はテンプレートクラスのメンバー関数
square(int, int*) と square(double, double*) は関数テンプレートのインスタンス化 (テンプレート関数)
次に示すコマンドは、テンプレートおよびインスタンス化されたテンプレートに使用します。クラスまたは型定義がわかったら、値の出力、ソースリストの表示、またはブレークポイントの設定を行うことができます。
whereis コマンドは、関数テンプレートまたはクラステンプレートの、インスタンス化された関数やクラスの出現すべてのリストを出力するために使用します。
クラステンプレートの場合は、次のように入力します。
(dbx) whereis Array メンバー関数: `Array<int>::Array(int) メンバー関数: `Array<double>::Array(int) クラステンプレートインスタンス: `Array<int> クラステンプレートインスタンス: `Array<double> クラステンプレート: `a.out `template_doc_2.cc` Array |
関数テンプレートの場合は、次のように入力します。
(dbx) whereis square 関数テンプレートインスタンス: `square<int>(__type_0,__type_0*) 関数テンプレートインスタンス: `square<double>(__type_0,__type_0*) |
__type_0 パラメータは、0 番目のパラメータを表します。__type_1 パラメータは、次のパラメータを表します。
詳細については、「whereis コマンド」を参照してください。
関数テンプレートおよびクラステンプレートと、インスタンス化された関数やクラスの定義を出力するために使用します。
クラステンプレートの場合は、次のように入力します。
(dbx) whatis -t Array template<class T> class Array 完全なテンプレート宣言を得るために次を実行してください: 'whatis -t Array<int>'; |
クラステンプレートの構造については次のように実行します。
(dbx) whatis Array 識別子 'Array' が複数あります 次のうち 1 つ選択してください: 0) 取り消し 1) Array<int>::Array(int) 2) Array<double>::Array(int> > 1 Array<int>::Array(int 1); |
関数テンプレートの場合は、次のように入力します。
(dbx) whatis square 識別子 'square' が複数あります 次のうち 1 つ選択してください: 0) 取り消し 1) square<int(__type_0,__type_0*) 2) square<double>(__type_0,__type_0*) > 2 void square<double>(double num, double *result); |
クラステンプレートのインスタンス化の場合は、次のように入力します。
(dbx) whatis -t Array<double> class Array<double>; { public: int Array<double>::getlength() double &Array<double>::operator [](int i); Array<double>::Array<double>(int l); Array<double>::~Array<double>(); private: int length; double *array; }; |
関数テンプレートのインスタンス化の場合は、次のように入力します。
(dbx) whatis square(int, int*) void square(int num, int *result); |
詳細については、「whatis コマンド」を参照してください。
テンプレートクラスのすべてのメンバー関数を停止するには、次のように入力します。
(dbx)stop inclass Array (2) stop inclass Array |
stop inclass コマンドを使用して、特定のテンプレートクラスのメンバー関数すべてにブレークポイントを設定します。
(dbx) stop inclass Array<int> (2) stop inclass Array<int> |
詳細については、「stop コマンド」 と 「inclass classname [-recurse | -norecurse]」を参照してください。
stop infunction コマンドを利用して、指定した関数テンプレートのインスタンスにブレークポイントを設定します。
(dbx) stop infunction square (9) stop infunction square |
詳細については、「stop コマンド」 と 「infunction function」を参照してください。
stop in コマンドを使用して、 テンプレートクラスのメンバー関数、またはテンプレート関数にブレークポイントを設定します。
クラスインスタンス化のメンバーの場合は、次のとおりです。
(dbx) stop in Array<int>::Array(int l) (2) stop in Array<int>::Array(int) |
関数インスタンス化の場合は、次のように入力します。
(dbx) stop in square(double, double*) (6) stop in square(double, double*) |
詳細については、「stop コマンド」 と 「in function」を参照してください。
スコープ内で停止した場合に、インスタンス化された関数やクラステンプレートのメンバー関数を明示的に呼び出すには、call コマンドを使用します。dbx で正しいインスタンスを決定できない場合、選択肢となる番号が付いたインスタンスのリストが表示されます。
(dbx) call square(j,&i) |
詳細については、「call コマンド」を参照してください。
print コマンドを使用して、インスタンス化された関数またはクラステンプレートメンバー関数を評価します。
(dbx) print iarray.getlength() iarray.getlength() = 5 |
printを使用して this ポインタを評価します。
(dbx) whatis this class Array<int> *this; (dbx) print *this *this = { length = 5 array = 0x21608 } |
詳細については、「print コマンド」を参照してください。
list コマンドを使用して、指定のインスタンス化された関数のソースリストを出力します。
(dbx) list square(int, int*) |
詳細については、「list コマンド」を参照してください。