0

整数の累乗を計算する次のメタ関数を考えてみましょう。

template <std::intmax_t Base, std::intmax_t Exponent> 
struct integer_power 
{
    static constexpr std::intmax_t temporary = integer_power<Base, Exponent/2>::value;
    static constexpr std::intmax_t value = temporary*temporary*(Exponent%2 == 1 ? Base : 1);
    static constexpr bool overflow = /* something */;
};

template <std::intmax_t Base> 
struct integer_power<Base, 0> 
{
    static constexpr std::intmax_t value = 1;
    static constexpr bool overflow = false;
};

結果を整数に格納できない場合、内部変数のオーバーフローが true になるようにしたいと思います。どうやってするか?

4

1 に答える 1

0

ええと...ベース、一時的なことはわかります。前のレベルがオーバーフローであったかどうかを知ることができます。私は次のようなものから始めます

template <std::intmax_t Base, std::intmax_t Exponent>
struct integer_power {
  typedef integer_power<Base, Exponent/2> half_power;
  static constexpr std::intmax_t temporary = half_power::value;
  static constexpr std::intmax_t value = temporary * temporary * (Exponent % 2 == 1 ? Base : 1);
  static constexpr bool overflow = half_power::overflow ? true :
      (temporary >
       std::numeric_limits<intmax_t>::max() / 
           ( temporary * (Exponent % 2 == 1 ? Base : 1)) ? true : false);
};

(私はそれをテストしておらず、ほとんど頭のてっぺんから書きました)

于 2013-11-09T06:07:22.697 に答える