8

我有一个任意精度Integer类,它很像 JavaBigInteger或 OpenSSL 的BIGNUM操作。我无法理解我应该如何表达numeric_limit<Integer>::max().

Stack Overflow 有几个问题询问是否可以这样做(例如是否可以将 std::numeric_limits 专门用于用户定义的类数字类?),以及一些使用原语的示例的答案,但我没有看到使用任意精度整数类的示例。我还访问了std::numeric_limits参考页面,但我不清楚在这种情况下我应该做什么。

在这一点上,我的外卖是可以专门numeric_limit用于 my Integer,并且可以将其放在标准命名空间中。我还需要专攻所有numeric_limits

如何为 指定无界限制numeric_limit<T>::max()


以下来自 GCC 4.2.1 <limits>(OS X 机器)。

/// numeric_limits<int> specialization.
template<>
  struct numeric_limits<int>
  {
    static const bool is_specialized = true;

    static int min() throw()
    { return -__INT_MAX__ - 1; }
    static int max() throw()
    { return __INT_MAX__; }

    static const int digits = __glibcxx_digits (int);
    static const int digits10 = __glibcxx_digits10 (int);
    static const bool is_signed = true;
    static const bool is_integer = true;
    static const bool is_exact = true;
    static const int radix = 2;
    static int epsilon() throw()
    { return 0; }
    static int round_error() throw()
    { return 0; }

    static const int min_exponent = 0;
    static const int min_exponent10 = 0;
    static const int max_exponent = 0;
    static const int max_exponent10 = 0;

    static const bool has_infinity = false;
    static const bool has_quiet_NaN = false;
    static const bool has_signaling_NaN = false;
    static const float_denorm_style has_denorm = denorm_absent;
    static const bool has_denorm_loss = false;

    static int infinity() throw()
    { return static_cast<int>(0); }
    static int quiet_NaN() throw()
    { return static_cast<int>(0); }
    static int signaling_NaN() throw()
    { return static_cast<int>(0); }
    static int denorm_min() throw()
    { return static_cast<int>(0); }

    static const bool is_iec559 = false;
    static const bool is_bounded = true;
    static const bool is_modulo = true;

    static const bool traps = __glibcxx_integral_traps;
    static const bool tinyness_before = false;
    static const float_round_style round_style = round_toward_zero;
};
4

2 回答 2

5

该标准对第max18.3.2.4 节中的成员函数进行了如下说明:

对所有专业都有意义is_bounded != false

所以你应该在你的类的文档中指定并指定调用它是没有意义的。is_bounded falsestd::numeric_limits<T>::max

于 2016-12-23T15:15:44.440 回答
1

关于这个问题:

在这一点上,我的外卖是可以为我的 Integer 专门化 numeric_limit

答案是肯定的,因为:

  1. 它是标准模板的特化,并且

  2. 它专门用于用户定义的类型。

来自 cppreference:

只有当声明依赖于用户定义的类型并且特化满足原始模板的所有要求时,才允许将任何标准库模板的模板特化添加到命名空间 std,除非禁止此类特化。

于 2016-12-23T15:41:49.980 回答