Jon*_*Mee 5 c++ for-loop template-meta-programming c++17 if-constexpr
c ++ 17提供if constexpr,其中:
condition的值必须是类型的上下文转换的常量表达式
bool.如果值为true,则丢弃statement-false(如果存在),否则,将丢弃statement-true
有没有办法在a- forstatement中使用它?要在编译时展开循环吗?我希望能够做到这样的事情:
template <int T>
void foo() {
for constexpr (auto i = 0; i < T; ++i) cout << i << endl;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在for语句中使用它?要在编译时展开循环吗?我希望能够做这样的事情
我不这么认为.
但是如果你能负担一个辅助函数,用std::integer_sequence一个未使用的C风格的整数数组初始化,从C++ 14开始你可以做如下的事情
#include <utility>
#include <iostream>
template <int ... Is>
void foo_helper (std::integer_sequence<int, Is...> const &)
{
using unused = int[];
(void)unused { 0, (std::cout << Is << std::endl, 0)... };
}
template <int T>
void foo ()
{ foo_helper(std::make_integer_sequence<int, T>{}); }
int main ()
{
foo<42>();
}
Run Code Online (Sandbox Code Playgroud)
如果你可以使用C++ 17,你可以避免unused使用折叠,使用折叠foo_helper()可以简单地编写如下
template <int ... Is>
void foo_helper (std::integer_sequence<int, Is...> const &)
{ ((std::cout << Is << std::endl), ...); }
Run Code Online (Sandbox Code Playgroud)
如果编译器知道循环限制,则编译器将展开循环(如果发现有好处)。并非所有循环展开都是有益的!关于循环展开的好处,您不可能做出比编译器更好的决策。
不需要constexpr for(如您所说),因为constexpr if启用了功能-您可能会将会使程序constexpr if错误格式的代码放在false分支中-这不是纯粹的优化。
Constexpr for另一方面,则将是纯优化(至少如您所描述的那样,不算循环执行0次的边缘情况),因此最好将其留给“假设”优化规则。
| 归档时间: |
|
| 查看次数: |
1562 次 |
| 最近记录: |