难以将函数转换为单个方程(constexpr)
Difficulty converting function to a single equation (constexpr)
我将代码库中的许多位操作函数转换为constexpr
。没有真正的原因,主要是"只是因为"。
在c++ 11中创建constexpr函数要求代码为单个表达式,这并不总是可能的(也不总是需要的)。
无论如何,我在使用这个函数时遇到了一些麻烦:
//Given a binary value like 00000100011, fills every bit below the highest '1' bit with a '1'.
//Example: 00000100011 -> 00000111111
inline uint32_t FillUntilHighestBit(uint32_t value)
{
value |= (value >> 1);
value |= (value >> 2);
value |= (value >> 4);
value |= (value >> 8);
value |= (value >> 16);
return value;
}
这是我写的一个尝试:http://ideone.com/BeQZUH
return (value |= (value |= (value |= (value |= (value |= (value >> 1)) >> 2) >> 4) >> 8) >> 16);
问题是,constexpr
不允许修改变量或将结果存储在变量中,因此复合or赋值|=运算符不能使用。
这意味着要把函数放在一个方程中,我必须做大量的or和位移位,因为我不能将中间结果存储在变量中。
有人看到任何方法围绕这个,或者有一个更好的方程是有效的constexpr,提供相同的结果?这对我来说不是一个关键的问题,但它是一组函数中唯一一个我不能转换为constexpr
的函数,并且坐在他们中间嘲笑我。div =)
你可以在一个constexpr中调用另一个constexpr,所以你可以这样写:
constexpr uint32_t internalFunc(uint32_t value,int s) {
return (value >> s) | value;
}
constexpr uint32_t FillUntilHighestBit(uint32_t value) {
return internalFunc(
internalFunc(
internalFunc(
internalFunc(
internalFunc(value,1)
,2)
,4)
,8)
,16);
}
另外,您的原始函数是在每行中使用值进行两次or-ing。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- Visual C++ constexpr Hints
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么constexpr的性能比正常表达式差
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 为什么std::isnan 不是 constexpr?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 更多constexpr容器是否需要mark_immutable_if_consexpr
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- constexpr上下文中std::initializer_list的验证
- constexpr构造函数需要常量成员函数时出现问题
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- C++constexpr实现差异
- 正弦级数方程计算不正确
- 难以将函数转换为单个方程(constexpr)