首页 > 解决方案 > 根据模板参数的数量“重载”模板

问题描述

我正在制作一个模板来帮助制作二维数组(矩阵)。现在,它只是 a 中std::arrays的别名std::array,我喜欢它,因为它将大小作为类型的一部分(这将有助于稍后进行编译时检查。

template <class T, size_t Rows, size_t Columns>
using Matrix = std::array<std::array<T, Columns>, Rows>;

我想选择省略T并将其默认为,double因为常见的情况是双打。

我意识到默认模板参数的正常方法是将其放在末尾,但是,为了匹配std::arrayAPI,我想避免使用template <size_t Rows, size_t Columns, class T = double>.

我尝试了以下方法,使编译器可以通过模板参数的数量进行选择,但由于“模板声明冲突”而失败。

template <class T, size_t Rows, size_t Columns>
using Matrix = std::array<std::array<T, Columns>, Rows>;

template <size_t Rows, size_t Columns>
using Matrix = std::array<std::array<double, Columns>, Rows>;

也许有一种更好的方法可以通过另一种模板机制来做到这一点?

标签: c++templates

解决方案


您不能重载别名。但是,您可以重载函数模板,并且可以利用这一事实来创建一个工厂函数,该函数将为您创建类的实例。会给你这样的功能

template <class T, size_t Rows, size_t Columns>
auto create_matrix() { return std::array<std::array<T, Columns>, Rows>{}; }

template <size_t Rows, size_t Columns>
auto create_matrix() { return std::array<std::array<double, Columns>, Rows>{}; }

然后你像这样使用它

auto double_matrix = create_matrix<2, 4>();
auto float_matrix = create_matrix<float, 2, 4>();

推荐阅读