c++ - 根据模板参数的数量“重载”模板
问题描述
我正在制作一个模板来帮助制作二维数组(矩阵)。现在,它只是 a 中std::array
s的别名std::array
,我喜欢它,因为它将大小作为类型的一部分(这将有助于稍后进行编译时检查。
template <class T, size_t Rows, size_t Columns>
using Matrix = std::array<std::array<T, Columns>, Rows>;
我想选择省略T
并将其默认为,double
因为常见的情况是双打。
我意识到默认模板参数的正常方法是将其放在末尾,但是,为了匹配std::array
API,我想避免使用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>;
也许有一种更好的方法可以通过另一种模板机制来做到这一点?
解决方案
您不能重载别名。但是,您可以重载函数模板,并且可以利用这一事实来创建一个工厂函数,该函数将为您创建类的实例。会给你这样的功能
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>();
推荐阅读
- c# - 如何将一些算法注入 BizForm 输入/输出?
- python - 使用 conda 在 cron 上运行 python 脚本
- c++ - 包含 netinet/in.h 和 netinet6/in6.h 时重新定义类型
- javascript - Redux connect 将一个不必要的 prop "dispatch" 传递给连接的组件
- python - 如何正确分组列?
- git - 如何仅保留 Git 存储库的最新版本
- terraform - 在 terraform 中运行破坏时处理外部数据源
- reactjs - 如何清理在 useEffect 之外创建的异步任务
- javascript - 如何在反应js中将数组转换为键值对?
- java - 为什么使用 BufferedReader 将数字输入值相加?