'if'在C++中使用模板

Dim*_*ath 3 c++ templates

我需要做这样的事情:

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_xxMatrix_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)