我需要做这样的事情:
template <typename Matrix_xx>
bool ProcessMatrix<Matrix_xx>::function1(Matrix_xx a) {
int x, y;
// ... some code here ... //
if (Matrix_xx == Matrix_1D) {
a->readFromFile(x);
} else if (Matrix_xx == Matrix_2D) {
a->readFromFile(x, y);
} // ...
}
Run Code Online (Sandbox Code Playgroud)
即,调用不同的函数取决于模板参数.上面的代码不会编译,因为只有Matrix_1D :: readFromFile(int x)和Matrix_2D :: readFromFile(int x,int y).我不想将function1拆分成两个不同的函数,因为会有很多加倍的代码.还有另外一种方法吗?
Jan*_*dec 10
将类型特定的代码包装在重载函数或显式专用模板中:
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);
}
Run Code Online (Sandbox Code Playgroud)
如果Matrix_xx是Matrix_1D,重载将选择第一个重载,如果它是Matrix_2D,重载将选择第二个重载,如果是其他任何重载,它将不会编译.但是如果某人提供了新类型的矩阵,他们可以通过定义它来进行编译doReadFromFile.
这通常是有用的技巧和标准库使用"traits"的原因 - 它们可以为某些人提供的类定义,并且可以为非类类型定义它们."traits"可以是显式专用模板或自由函数的形式,通常用依赖于参数的查找查找(放在其参数的命名空间中,而不是模板).
为完整起见,显式特化将如下所示:
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);
}
}
Run Code Online (Sandbox Code Playgroud)