C++11 c++;11在无增压的情况下实现均匀等分布的长周期线性(井)?
Sergiu Dotenco善意地提出,有人能推荐一个没有boost的开源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); } }; 模板 结构模块帮助器
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)>