重複コードを避けたい2017年8月、画像の膨張・収縮アルゴリズムについて調べたときに、双方のコードの重複が気になりました。ポリシークラスを使用したジェネリックプログラミングによる実装を考えてみます。膨張・収縮アルゴリズム膨張処理も収縮処理も、Y座標とX座標によるラスタスキャン・ループの部分は同じコードで重複しています。実際、片方のコードはコピペして作成してしまいました。簡単なコードなので、重複していることは気になりませんし、このコードのままで良いと考えています。複雑なコードだった場合はどうでしょうか?いつまでも、コピペを続けますか?ジェネリックプログラミングとは動的ポリモーフィズム共通メインルーチン化という「ポリモーフィズムによる実装」は、良い考え方だと思います。ポリモーフィズムによる実装しかし、C++言語による継承と仮想関数を利用するポリモーフィズムは、動的なポリモーフィズムとなり実行時に結合します。この仕組みは、仮想関数テーブルを作成して実行時にテーブル参照して呼ぶ関数を決定します。従って関数呼び出しのオーバーヘッドが増加します。静的ポリモーフィズム重複コードを改善するために、探究心の強いC++言語の名人プログラマーが考える方法はジェネリックプログラミングによる実装です。共通メインルーチン化のポリモーフィズムを静的に実現できないだろうかと考えます。同じメソッドを呼び出しても実際のインスタンスごとにその挙動をコンパイル時に決定することは可能でしょうか?C++はテンプレートという記述方法があり、ジェネリックプログラミングができます。テンプレートは、どんなクラス(データ型)を使用するかを明記しないでクラスを記述することができます。使用するときにテンプレート引数でクラスを宣言します。すべてコンパイル時に静的に解決します。従って、実行時のオーバーヘッドは発生しません。関数テンプレート関数テンプレートとは、関数の引数の型を明示しないで「Tは何らかの型」として関数を定義します。この関数テンプレートを参照するときテンプレート引数で型を宣言することにより、関数定義をジェネレートします。);}引数の型がint型の例を示します。下記、int型の関数定義をジェネレートします。);}引数の型がbouble型の例を示します。下記、bouble型の関数定義をジェネレートします。);}クラステンプレートクラステンプレートとは、使用する型を明示しないで「Tは何らかの型」としてクラスを定義します。このクラステンプレートをインスタンス化するときテンプレート引数で使用する型を宣言することにより、クラス定義をジェネレートします。}};int型のクラスの例を示します。iVar.get();下記、int型のクラス定義をジェネレートします。}};double型のクラスの例を示します。iVar.get();下記、double型のクラス定義をジェネレートします。}};ポリシークラステンプレートポリシークラステンプレートとは、クラスの挙動をテンプレートで差し替えます。(Host)このクラステンプレートをインスタンス化するとき、テンプレート引数でポリシークラスを宣言することにより、クラス定義をジェネレートします。振る舞いは、テンプレートパラメータに与えるポリシークラスによってコンパイル時に決定します。std::endl;}};ポリシークラスの参照の例を示します。仮想的に、下記クラス定義をジェネレートします。インスタンスを二つ生成していますので、テンプレートからホストクラスを静的に二つ生成します。go(){PolicyB::func();}};ジェネリックプログラミングによる実装3つのクラスを定義します。