使用C++模板和if constexpr
,我发现了一个我非常喜欢的技巧:假设你有一个函数,它有一些已知的编译时可调选项,我可以编写类似的东西
template <bool Op1, bool Op2, bool Op3>
void my_func()
{
...
if constexpr (Op1) {
...
} else {
...
}
... //similar (possibly even nested) constexpr
}
现在,我认为这在保存的代码行(有n个选项,一个有2^n个不同的函数(和性能方面都很方便,因为这些if
是在编译时计算的(例如,假设这个函数通过循环中的委托被调用多次(。实际上,在编译过程中,会使用所有选项创建此函数的2^n个副本。
我对Rust做一些类似的事情很感兴趣。我注意到通用参数已经存在,但我不确定是否有等效的if constexpr
。当然,我希望能找到其他更可靠的解决方案,具有相同的要求:没有不必要的运行时if,没有复制粘贴代码。
您可以使用简单的if
s。优化器几乎不可能不消除常量if false
或if true
。C++中if constexpr
的唯一优点是,如果表达式的计算结果为false
,则可以将无法编译的内容放在那里。