2017-12-08 2 views
-2

Sergiu Dotencoがhis implementation based on boostに寄付しました。誰かがブーストなしでオープンソースのC++ 11スタイルの実装をお勧めしますか? Googleはいくつかの結果を提供していますが、これは数学的に深いことですが、私は実装の質を区別できませんでした。ここでブーストなしのWell Equidistributed Long-period Linear(WELL)のC++ 11実装?

+0

多くは、標準ライブラリに存在し、吸収されている使用(少し)コンパイル時のプログラミングを行っている方法です。唯一の難しい部分は 'boost :: mpl :: apply'の使用です。しかし、コンパイル時の'% '計算の最適化のためだけです。 – Caleth

+0

'mpl'を' constexpr'関数に置き換えることができるようです – Caleth

+0

@カルテええ、mplは私の頭痛です。それを 'constexpr'と置き換える方法は?いくつかの例を挙げることができますか? – athos

答えて

1

は、C++ 11は、ブーストの容易な

template <typename UIntType> constexpr bool IsPowerOfTwo(UIntType r) 
{ 
    return (r & (r - 1)) == 0; 
} 

namespace detail 
{ 
    template<class UIntType, UIntType r, bool> 
    struct ModuloHelper; 

    template<class UIntType, UIntType r> 
    struct ModuloHelper<UIntType, r, true> 
    { 
     template<class T> 
     static T calc(T value) 
     { 
      return value & (r - 1); 
     } 
    }; 

    template<class UIntType, UIntType r> 
    struct ModuloHelper<UIntType, r, false> 
    { 
     template<class T> 
     static T calc(T value) 
     { 
      while (value >= r) 
      { value -= r; } 

      return value; 
     } 
    }; 
} 

template<class UIntType, UIntType r> 
struct Modulo : detail::ModuloHelper<UIntType, r, IsPowerOfTwo(r)> 
+0

これを見ても、あなたは 'IsPowerOfTwo'という定義を必要としません。ちょうど'(r&(r-1))== 0'という式を置くことができます。しかし、 '' IsPowerOfTwo''は再利用可能ですが、 – Caleth

+0

さらに、 'r'がテンプレートパラメータの場合、現代のコンパイラは' x%r'を書いたときに*これだけを行う*ことはしません。 – Caleth

+0

それは別の話題ですが、基本的に私は名目上ブーストを取り除く方法を探しています。 – athos

関連する問題