为什么我可以在C++中使用ratio对象

cha*_*ign 6 c++ c++11 c++-chrono

我正在学习ratioC++ 11.根据cplusplus.com和专业C++第2版(以下段落摘录).

有理数的分子和分母表示为类型的编译时常量std::intmax_t.由于这些有理数的编译时性质,使用它们可能看起来有点复杂并且与平常不同.您不能像定义普通对象一样定义比率对象,也不能在其上调用方法.你需要使用typedefs.

这意味着我必须写

typedef ratio<1,3> one_third;
Run Code Online (Sandbox Code Playgroud)

代替

ratio<1,3> one_third;
Run Code Online (Sandbox Code Playgroud)

但我发现这两种写入比率方式都有效.我可以访问使用任一比率的成员.::.

问题1. cplusplus.com和Professional C++书籍是否有误?

以下代码段来自cplusplus.com示例.

typedef std::ratio<1,3> one_third;
typedef std::ratio<2,4> two_fourths;
typedef std::ratio_add<one_third,two_fourths> sum;
std::cout << sum::den << std::endl;
Run Code Online (Sandbox Code Playgroud)

问题2.然而,我收到了一个错误(VS 2012)

error C2039: 'den' : is not a member of 'std::ratio_add<_R1,_R2>'
Run Code Online (Sandbox Code Playgroud)

根据评论,使用typedef ratio_add<one_third, two_fourths>::type sum更便携.

Pra*_*ian 13

你不用必须使用typedefS,但书上说,<ratio>处理与编译时的数学,并在其定义的元函数采用类型模板参数.

如果你不使用typedef你正在创建一个std::ratio<1,3>named 实例one_third,它不适合作为类型参数传递.在这种情况下,您需要使用decltype到达可以传递给的适当类型ratio_add

std::ratio<1,3> one_third;
std::ratio<2,4> two_fourths;
std::ratio_add<decltype(one_third), decltype(two_fourths)> sum;
std::cout << decltype(sum)::den << std::endl;
Run Code Online (Sandbox Code Playgroud)

现场演示


您看到的错误消息是因为ratio_add(由于缺乏对别名模板的支持)(和其他类似的元函数')实现不符合VS2012的标准.如链接的错误报告中所述,解决方法是使用嵌套类型type.

typedef std::ratio_add<one_third,two_fourths>::type sum;
std::cout << sum::den << std::endl;
Run Code Online (Sandbox Code Playgroud)