c++ - 'if' 与 C++ 中的模板

标签 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);
    } // ...

}

即调用不同的函数取决于模板参数。上面的代码无法编译,因为只有 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_xxMatrix_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/

相关文章:

c++ - 在 C++17 中弃用 `std::result_of` 的原因是什么?

c++ - 我应该返回一个右值引用(通过 std::move'ing)吗?

c++ - const void* 作为 C++ 中 MKL Blas 例程的复数

c++ - 为什么我不能创建这样的模板函数?

c++ - 使用模板输出过载

c++ - 模板元编程的可变参数模板

c++ - 为什么编译器选择这个模板函数而不是重载的非模板函数?

C++:从父级调用子级静态方法

c++ - 在构造函数中创建的外部 vector

C++ 选择一个属性作为排序依据