【问题标题】:C++ Get object type at compile time, e.g., numeric_limits<typeof<a>>::max()?C++ 在编译时获取对象类型,例如 numeric_limits<typeof<a>>::max()?
【发布时间】:2009-10-16 17:02:29
【问题描述】:

给定int a;,我知道以下返回a 可以容纳的最大值。

numeric_limits&lt;int&gt;::max()

但是,我想在不知道aint 的情况下获得同样的信息。我想做这样的事情:

numeric_limits&lt;typeof&lt;a&gt;&gt;::max()
不是使用这种确切的语法,但使用 ISO C++ 甚至可能吗?


谢谢大家。 Aurélien Vallée 的 type_of() 最接近,但我不想在我们的代码库中添加任何额外内容。由于我们已经使用了 Boost,Éric Malenfant 对 Boost.Typeof 的引用导致我使用

numeric_limits&lt;BOOST_TYPEOF(m_focusspeed)&gt;::max()

我以前从未使用过它。再次感谢您提供这么多消息灵通的回复。

【问题讨论】:

    标签: c++ types typeof


    【解决方案1】:
    template<typename T>
    T get_lim( const T & x)
    {
     return numeric_limits<T>::max();
    }
    

    好在你可以在不明确指定 T 的情况下使用它:

    size_t l = get_lim(34);

    【讨论】:

    • 当然,这不会给你一个编译时常量。在 C++0x 中,这可能是 constexpr,您可以获得编译时常量。
    • minmax 不返回 size_t。他们应该返回 T(这似乎很明显)。
    • 来自 numeric_limits 的片段:模板 class numeric_limits { public: static T min() throw();静态 T max() throw(); };
    • @Aurélien Vallée:你是对的,但我可以返回 size_t ,因为我编写了函数。无论如何,我已经纠正了这一点。谢谢。 :)
    • 稍微更一般:模板 std::numeric_limits NumericLimitsOf(const T&){ return std::numeric_limits(); }
    【解决方案2】:

    只是 FWIW,C++ 0x 也将有 decltype,这与 typeof 几乎相同。他们选择了一个新名称,主要是因为在一种情况下语义不同。 typeof (gcc) 的现有实现从类型中删除了引用,因此 typeof(int &amp;) == int。该标准要求decltype(int &amp;) == int&amp;。这通常并不重要,但他们决定使用不同的名称来防止对现有代码进行任何静默更改。

    【讨论】:

      【解决方案3】:

      numeric_limits 是所谓的类型特征。它以不显眼的方式存储与类型相关的信息。

      关于您的问题,您只需定义一个模板函数,该函数将为您确定变量的类型。

      template <typename T>
      T valued_max( const T& v )
      {
        return numeric_limits<T>::max();
      };
      
      template <typename T>
      T valued_min( const T& v )
      {
        return numeric_limits<T>::min();
      };
      

      或者只是创建一个小类型返回结构:

      template <typename T>
      struct TypeOf
      {
        typedef T type;
      };
      
      template <typename T>
      TypeOf<T> type_of( const T& v )
      {
        return TypeOf<T>();
      }
      
      int a;
      numeric_limits<type_of(a)::type>::max();
      

      【讨论】:

      • 遗憾的是,我不认为“type_of(a)::type”是合法的。如果这样一个简单的技巧能奏效,那么 Boost.Typeof 就不会存在了 :)
      • @Eric 你是对的。我刚刚检查并且 type_of(a)::type 不能出现在常量表达式中,例如模板参数:( @Plong:我找到了一个链接,解释了如何正确实现它。我检查了 boost,它们是使用相同的技巧,请参阅:peousware.com/implementer-un-typeof-et-un-foreach-en-c
      【解决方案4】:

      numeric_limits&lt;typeof(a)&gt; 与 GCC 一起使用。 (如果您在标准兼容模式下使用它,则可能需要改用__typeof__。)

      【讨论】:

        【解决方案5】:

        Starting with C++11,你可以使用decltype()

        numeric_limits<decltype(a)>::max()
        

        另见Difference between decltype and typeof?

        【讨论】:

          猜你喜欢
          • 2011-09-01
          • 2013-11-10
          • 2020-08-22
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 2016-10-31
          • 1970-01-01
          • 2013-08-20
          相关资源
          最近更新 更多