我需要做这样的事情:
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);
} // ...
}
即调用不同的函数取决于模板参数。上面的代码无法编译,因为只有 Matrix_1D::readFromFile(int x) 和 Matrix_2D::readFromFile(int x, int y)。我不想将 function1 拆分为两个不同的函数,因为会有很多双重代码。还有别的办法吗?
最佳答案
将特定于类型的代码包装在重载函数或显式专用模板中:
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
是Matrix_1D
,重载会选择第一个重载,如果是Matrix_2D,重载会选择第二个重载,如果是其他的,则不会编译。但是如果有人提供了新类型的矩阵,他们可以通过为它定义 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);
}
}
关于c++ - 'if' 与 C++ 中的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12833867/