【发布时间】:2015-03-08 22:40:12
【问题描述】:
我正在阅读this excellent answer,它使用可笑的持续时间单位microfortnights 以令人难忘的方式说明了一个好点。
typedef std::ratio<756, 625> microfortnights;
std::chrono::duration<int, microfortnights> two_weeks(1000000);
我想到了这个问题:
如果我真的想这样做(更有可能是其他一些重要的 持续时间,例如在一帧期间或 N 个周期期间可用的时间 处理器),最好的方法是什么?
我知道ratio<N, D> 将创建一个与N 和D 的每个值相关联的唯一类型。所以ratio<4, 6> 与ratio<2, 3> 是不同的类型,即使它们代表相同的(减少的)分数。我是否总是需要进行数学运算才能将转换因子简化为简化项?
这样写会更方便:
using microfortnights = std::chrono::duration<long, ratio<86400*14, 1000000>>;
代替:
using microfortnights = std::chrono::duration<long, ratio<756, 625>>;
但是这些将是两种不同的类型,而不是相同的类型。第一个表达式更容易检查正确性。但是这个分数有很多表示,第二个可以说是规范的,因此是首选的。如果我的程序中有太多实际上代表同一个单元的类型,那么这可能会导致不必要的模板代码膨胀。
【问题讨论】:
-
可以将问题标题改写为
std::ratio吗?除了所选示例之外,总体主题似乎与chrono几乎没有关系? -
你说得很好。但是我想继续关注
durations,否则我担心我的观众不会看到ratio的实际应用。我在标题中添加了ratio,以便搜索ratio将更容易找到此Q/A。 -
呵呵。无论如何+1。 (具有讽刺意味的是,我花了一段时间才发现这实际上比仅仅创建难以捉摸的 microfortnight “正确” :))
-
不是
2000000microfortnightsfour_weeks,不是two_weeks?