【问题标题】:using <ratio> without typedef使用没有 typedef 的 <ratio>
【发布时间】:2014-05-22 13:04:18
【问题描述】:

我总是被告知typedef 用于简化事物或缩短名称。我的意思是,我们可以在没有它的情况下做事。但是今天我尝试使用&lt;ratio&gt;库,不使用typedef我不知道该怎么做。

这是一个简单的例子:

#include <iostream>
#include <ratio>    // C++11

int main()
{
    const int   a = 1, b = 17;
    typedef     std::ratio<a,b> p;

    std::cout << "Number p = " << p::num << "/" << p::den << std::endl; 

    return 0;
}

如果不使用typedef,我怎样才能做到这一点?

【问题讨论】:

  • std::ratio&lt;a,b&gt;::numstd::ratio&lt;a,b&gt;::den 不起作用?此外,typedef 不仅仅是为了简化事情。有时它被用来赋予一种类型以意义。例如typedef int priority; 和更高版本的priority p1, p2;typedef 的另一个非常流行的用例是用于抽象。例如,在一个系统中,您可能有 typedef int sig_atomic_t; 和另一个系统中的另一个定义。

标签: c++ c++11 typedef


【解决方案1】:

我不明白你为什么需要 typedef:

int main() {
    const int a = 1, b = 17;
    std::ratio<a,b> p;

    std::cout << "Number p = " << p.num << "/" << p.den << std::endl; 

    return 0;
}

或者,如果您不想创建变量,请按照其他人提到的那样进行:

std::cout << "Number p = " << std::ratio<a,b>::num << "/" << std::ratio<a,b>::den << std::endl; 

【讨论】:

  • 所以我可以只使用点吗?谢谢,p.num 有效 :) 当我试图通过 :: 引用时,我遇到了错误 C2510 'p' : left of '::' must be a class/struct/union
  • 在第一个示例中,我创建了一个ratio 类型的变量p。第二种,每次都会创建匿名ratio对象。
  • @JohnnyMopp 实际上,第二次访问static conststd::ratio&lt;a,b&gt; 的成员(不是该类的任何对象)。
  • @Massa 我没有意识到numdenstatic
【解决方案2】:

你可以这样做

std::ratio<a,b>::num

如果你不想使用 typedef

【讨论】:

    【解决方案3】:

    std::ratio, numden 中是成员对象而不是类型。因此你不能typedef他们。因为这些成员是constexpr,你可以在没有像ratio&lt;a,b&gt;::num这样的对象的情况下使用它们。

     

    numden 的类型是 std::intmax_t。要使您的类型合法,您可以使用typedef decltype(ratio&lt;a,b&gt;::num) t;,这与您想要的相去甚远且无用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 2018-12-26
      • 1970-01-01
      • 2021-09-09
      相关资源
      最近更新 更多