c++ - 用于重载解析的 C++ 普通结构类型
问题描述
作为一个例子 - 假设我有接受三个整数参数的函数并想要创建一个日期 - 例如:
std::chrono<something> make_date(int year, int month, int day) {
...
}
这个 api 很危险,因为它很容易混合参数的顺序 - 即挪威人可能会喜欢称它为make_date(25, 12, 2021)
圣诞节。我已经看到人们制作(零开销?)结构类型的模式,例如
struct Day ...
struct Month ...
struct Year ...
std::chrono<something> make_date(Year y, Month m, Day d) {
}
auto christmas_day = make_date(Year{2021}, Month{12}, Day{25});
但模式的细节让我望而却步。
更新:由于我的真实用例实际上根本与日期无关,我将制作一个更接近真实情况的替代示例。我有一个不可变的容器,global_size
但容器中的许多元素都是空的 - 因此对应的非空元素的数量active_size
远小于全局大小。容器中的元素非常大 - 所以只存储活动的:
template <typename T>
class container {
const T& get(std::size_t global_index) const {
auto active_index = this->index_map.at(global_index);
return this->storage[active_index];
}
private:
std::vector<T> storage;
std::map<std::size_t, std::size_t> index_map;
}
现在的重点是我想创建一个重载,它在空间中获取一个索引[0, active_size>
并直接从存储中返回:
const T& get(std::size_t active_index) const {
return this->storage[active_index];
}
但由于该get(std::size_t) const
插槽已被在空间[0, global_size>
中采用索引的方法占用,该索引不是直接选项。这就是为什么我认为我可以制作简单的结构
struct ActiveIndex ...
struct GlobalIndex ...
本质上是美化std::size_t
的——但仍然足以为重载解决方案提供基础。
更新 2:好的 - 事实证明这并没有我想象的那么神奇;
struct Day {
int value;
};
并访问内部 int 值,就像.value
它的全部内容一样。
解决方案
推荐阅读
- micronaut - 忽略@MicronautTest 的“数据源”
- django - 登录和注销视图是必要的吗?( SimpleJwt+Django 休息框架)
- python - 在 Gtk 4.0 + X11 中列出窗口
- c# - 如何通过主要活动更改媒体播放器的音量
- android - 使用本机反应更改整个系统(移动)字体
- prolog - Prolog回溯位置
- css - 是否可以使边界半径的行为像 figma
- python - 是否可以像 Jupyter 一样“保存” Python 脚本的信息并运行单独的函数?
- spring-boot - 使用附加的“常量”条件限制 @SecondaryTable 查询
- bash - 如何使用 cloudinit 运行自定义安装命令/脚本