C++11 c++;11在无增压的情况下实现均匀等分布的长周期线性(井)?

C++11 c++;11在无增压的情况下实现均匀等分布的长周期线性(井)?,c++11,random,C++11,Random,Sergiu Dotenco善意地提出,有人能推荐一个没有boost的开源c++11风格的实现吗?谷歌确实提供了一些结果,但这有点深奥,我无法区分实现的质量。以下是c++11如何使编译时编程(稍微)更容易 template constexpr bool IsPowerOfTwo(UIntType r) { 返回值(r&(r-1))==0; } 名称空间详细信息 { 模板 结构模块帮助器; 模板 结构模块帮助器 { 模板 静态T计算(T值) { 返回值&(r-1); } }; 模板 结构模块帮助器

Sergiu Dotenco善意地提出,有人能推荐一个没有boost的开源c++11风格的实现吗?谷歌确实提供了一些结果,但这有点深奥,我无法区分实现的质量。

以下是c++11如何使编译时编程(稍微)更容易

template constexpr bool IsPowerOfTwo(UIntType r)
{
返回值(r&(r-1))==0;
}
名称空间详细信息
{
模板
结构模块帮助器;
模板
结构模块帮助器
{
模板
静态T计算(T值)
{
返回值&(r-1);
}
};
模板
结构模块帮助器
{
模板
静态T计算(T值)
{
而(值>=r)
{value-=r;}
返回值;
}
};
}
模板
结构模:细节::模帮助

那里使用的大部分增强功能都已被吸收到标准库中。唯一棘手的部分是使用
boost::mpl::apply
等。然而,这似乎只是为了优化编译时
%
计算。看起来您可以用
constepr
替换
mpl
functions@Caleth是的,mpl是我的头痛。如何将其替换为
constexpr
?你能举个例子吗?当我看这个的时候,你甚至不需要定义
IsPowerOfTwo
,你可以把表达式
(r&(r-1))==0
放在那里
IsPowerOfTwo
是可重用的,但是,我不确定现代编译器在编写
x%r
时是否会为您完成所有这些,因为
r
是另一个主题的模板参数,基本上,我在寻找一种名义上摆脱boost的方法。看看say的输出,似乎你可以放弃它。或者,我不明白,从这里你发现什么可以放弃?
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)>