テンプレートと多重定義とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > テンプレートと多重定義の意味・解説 

テンプレートと多重定義

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/09 03:43 UTC 版)

多重定義」の記事における「テンプレートと多重定義」の解説

C++様に多重定義テンプレート使用可能な言語では、両方機能組み合わせることにより静的な多態実現することができる。また、PostgreSQLストアドプロシージャーの様なテンプレート備えていない言語でも同様の多態実現できる場合がある。 以下に例を示す。 // 引数value符号に応じて、-1, 1または0を返す関数。// ※abs使用しているため、引数指定できる値の値の範囲はこの関数の引数と同じ型(反変な型)をとるabs仕様依存するtemplate Type Sign( Type const &value ){ return Type() == value ? Type() : abs( value ) / value; // 除算演算子及び、abs関数実体Sign引数によって変わる}int main(void){ double value = -2; std::valarray array( 2 ); // ※double用にincludeが必要。 double value_sign = Sign( value ); // double型の-1, 1または0が返る std::valarray array_sign = Sign( array ); // -1, 1または0を含むvalarrayの値が返る return EXIT_SUCCESS;} この例ではSign関数内部演算子abs関数Sign関数引数指定した値によって変化する。なお上関数テンプレート複素数型 std::complex に対して適用するともできるその場合、結果正規化された複素数正規化ベクトル)となり、符号関数複素数への拡張一致するこの様にテンプレートと多重定義を備え言語では、多重定義オーバーライド代用することができる。 多重定義による多態は、コンパイル時にしか実現できないという問題があるものの単純なオーバーライドでは実現しづらい各種柔軟性備えている。 まず、メンバー関数だけでなく大域スコープ関数クラスインターフェース一部として見做す事が出来るようになる。これにより、単に手続き型要素でしか無かった大域スコープ関数オブジェクト指向機能の一要素として組み入れる事が出来る。そして、大域スコープ関数インターフェースとして機能し始める事によりクラスだけでなく、intdouble型といったメンバー関数持てない型にもオブジェクト指向恩恵得られる様になるのである次に大域スコープ関数直接クラス所属しないという特性によりメンバー関数より柔軟な拡張性を得る事が出来る。例えば、外部ライブラリーのあるクラスメンバー関数追加することは、外部ライブラリー手を加えなければいけないため事実上無理である。それに対し大域スコープ関数追加する場合は、外部ライブラリー手を加える必要がなく容易である。また、関数テンプレート実装すれば複数クラス横断的に拡張できる先にテンプレート関数存在する場合や、拡張対象クラス親クラス対す関数存在する場合新たに、より具体的な型を引数に取る関数追加することで静的オーバーライドが可能となる。 次に単一ディスパッチでは不可能な多重ディスパッチ模倣できるという点がある。これにより、例え矩形描画ようとする際、描画デバイス矩形描画対応していれば、デバイス直接矩形情報送り描画デバイス矩形描画対応してなければパス線分その他の機能使って矩形描画するといった処理が自然な形で記述可能となる。 なお大域スコープ記述しているが名前空間中にあっても次の例のように多態性実現は可能である。この仕組み実引数依存の名前探索という。 #include namespace Graphics{ class Line { /* 省略 */ }; class Ellipse { /* 省略 */ }; class Square { /* 省略 */ Line At( size_t index ) const; // 四角形の辺を返す関数 /* 省略 */ }; void Draw( ... ) { } // 四角形描画する template void Draw( Type &device, Square const &shape ) { Draw( device, shape.At( 0 ) ); Draw( device, shape.At( 1 ) ); Draw( device, shape.At( 2 ) ); Draw( device, shape.At( 3 ) ); }}namespace PNGDevice{ struct Device { /* 省略 */ }; // PNG用に線分描画する void Draw( Device &device, Graphics::Line const &shape );}namespace JpegDevice{ struct Device { /* 省略 */ }; // Jpeg用に線分描画する void Draw( Device &device, Graphics::Line const &shape );}int main(){ PNGDevice::Device device0; JpegDevice::Device device1; Draw( device0, Graphics::Square( 0, 0, 1, 1 ) ); // 内部でPNGDevice::Draw( Device &, Graphics::Line const & )を呼び出す Draw( device1, Graphics::Square( 0, 0, 1, 1 ) ); // 内部でJpegDevice::Draw( Device &, Graphics::Line const & )を呼び出す Draw( device0, Graphics::Ellipse( 0, 0, 1, 1 ) ); // Graphics::Draw( ... )を呼び出す Draw( device1, Graphics::Ellipse( 0, 0, 1, 1 ) ); // Graphics::Draw( ... )を呼び出す return EXIT_SUCCESS;}

※この「テンプレートと多重定義」の解説は、「多重定義」の解説の一部です。
「テンプレートと多重定義」を含む「多重定義」の記事については、「多重定義」の概要を参照ください。

ウィキペディア小見出し辞書の「テンプレートと多重定義」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「テンプレートと多重定義」の関連用語

テンプレートと多重定義のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



テンプレートと多重定義のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの多重定義 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2024 GRAS Group, Inc.RSS