8

也许是一个矛盾的问题:ratio<,>根据定义,是一个编译时常量。

但是,我想构建具有不同比率的持续时间,这些比率可以由我的方法的调用者指定。我猜我应该使用比率和/或持续时间以外的东西,那么,但是什么?

例如,我想要一个可以在运行时设置的类成员,并且我希望它是 ratio<,> 类型。在代码中的某个时刻,该成员被设置/分配,它将被分配一个恒定的比率,但在我的班级中,我不想指定该比率应该是多少。

4

2 回答 2

10

好的,你需要一个std::ratio可以由调用者指定”。有三种不同的选择:

  • 调用者希望在编译std::ratio期间设置模板参数。这很简单,只需设置参数,例如.using quarter = std::ratio<1, 4>
  • 调用者希望在运行时std::ratio设置模板参数。根据定义,这是不可能的,是编译时常量。您将必须在运行时实现自己的类来计算比率或使用某种库(我不知道,欢迎提出建议!)。std::ratio
  • 调用者只是想缩放 a std::duration(这就是你似乎使用你std::ratio的)。然后将其乘以一个数字
于 2018-06-14T06:28:45.120 回答
4

答案说明了使用 C++ 模板的常用方法:

template<typename ratio_type>
returnvalue function_name(ratio_type const& r, other parameter...)
{ ... }

关键是,比率的类型包含信息。由于类型(通常但不总是)是传递给模板的参数,因此您也可以通过模板转发这些参数。当然,这只会将问题转移到不同的地方,因此在某些时候,您将从比率中获取分子和分母并将其用作值。

顺便说一句:考虑std::divhttp://en.cppreference.com/w/cpp/numeric/math/div)作为替代方案。

于 2018-06-14T06:13:31.583 回答