将代码转换为constexpr
的一般提示是什么?比方说,有一种算法可以对(输入)几何图形进行几何变换。输入和输出因性质和大小而不同,并且非常简单地相互依赖。目前它是作为一个类实现的,目前使用std::map
和std::vector
(不失一般性)。
有什么方法可以重构使用动态内存的代码来获取符合常量表达式要求的代码?
我可以想象constexpr
兼容容器和constexpr
的某种组合 - "stack allocator"的兼容实现(对于足够大的存储空间),用于所使用的每个value_type
容器。但是有一个问题:我从未遇到过这样的容器。但也许还有其他方法吗?
答案 0 :(得分:5)
对于标准库中的大多数算法和实用程序类(std::bitset
,std::array
等),您只需在任何地方添加constexpr
说明符,尝试将结果存储在constexpr
变量中。 最有可能的是,这将成功编译并运行。另请参阅this Q&A。
通常会阻止此类代码编译的是编译时常量表达式的当前语言限制之一,例如(查看完整列表的 5.20常量表达式[expr.const] )
std::inplace_merge
例如。)<iostream>
)reinterpret_cast
goto
(建议但在N4472标准化中被拒绝)对于每个限制,都有办法解决它
new
/ delete
来编写一个大的内存池
全局constexpr
数组。constexpr
函数)并调度它们
switch
声明。constexpr operator()
。reinterpret_cast
的替代方法是使用constexpr
variant(其下方有union
)。goto
的替代方法是使用编写更多结构化代码
常规循环和分支。在所有情况下,您将失去能够调用new
/ delete
或隐式动态调度的语法细节。您必须手动分配/取消分配内存并手动选择功能指针。
请注意,即使使用当前的C ++ 14/17语言,标准库的大部分也可以constexpr
,但它们目前不是。此外,标准库实现者不得添加额外的constexpr
功能(与允许提供更强noexcept
支持相反)。
如果您认为应该提供更多或更简单的constexpr
支持(包括语言和标准库),请向您的供应商或C ++委员会投诉。