オーバーロードされた関数または明示的に特化されたテンプレートのいずれかで、型固有のコードをラップします。
void doReadFromFile(Matrix_1D &a, int x, int y)
{
a->readFromFile(x);
}
void doReadFromFile(Matrix_2D &a, int x, int y)
{
a->readFromFile(x, y);
}
template <typename Matrix_xx>
bool ProcessMatrix<Matrix_xx>::function1(Matrix_xx a) {
int x, y;
// ... some code here ... //
doReadFromFile(a, x, y);
}
Matrix_xx
isの場合Matrix_1D
、オーバーロードは最初のオーバーロードを選択し、Matrix_2D の場合、オーバーロードは 2 番目のオーバーロードを選択し、それ以外の場合はコンパイルしません。しかし、誰かが新しいタイプの行列を提供した場合、そのための を定義することでコンパイルできますdoReadFromFile
。
これは、一般的に便利なトリックであり、標準ライブラリが「特性」を使用する理由です。特性は、誰かが提供するクラスに対して定義でき、クラス以外の型に対して定義できます。「特性」は、明示的に特殊化されたテンプレートまたはフリー関数の形式のいずれかであり、通常は引数依存のルックアップで検索されます (テンプレートではなく、引数の名前空間に配置されます)。
完全を期すために、明示的な特殊化は次のようになります。
template <typename Matrix_xx>
struct doReadFromFile {};
template <>
struct<Matrix_1D> struct doReadFromFile {
void operator()(Matrix_1D &a, int x, int y) {
a->readFromFile(x);
}
}
template <>
struct<Matrix_1D> struct doReadFromFile {
void operator()(Matrix_1D &a, int x, int y) {
a->readFromFile(x, y);
}
}