【发布时间】:2020-05-04 19:01:33
【问题描述】:
我正在编写一个 constexpr 函数,需要使用 constexpr。循环可以手动展开,但我发现代码很难看而且是多余的。
如何制作“constexpr for”?
我应该创建一个助手类吗?如果是这样,我将如何写这样的东西:
#define for_constexpr( TYPE, VAR, START, CONDITION, END_OP, BODY ) \
for_constexpr_helper< \
TYPE, START, // TYPE START = 0; \
[ ]( TYPE VAR ) constexpr { return CONDITION; }, \
[ ] constexpr { END_OP; }, \
[ & ]( TYPE VAR ) constexpr { BODY; } >( )
用法类似于
int x = 0;
for_constexpr( int, i, 0, i < 3, ++i, x += i * 2 );
更具体地说,如何在 constexpr 上下文中使用i,例如模板参数?
我有什么选择?
示例代码:
auto ret = 0;
for ( int i = 0; i < 3; ++i )
{
static_assert( i != 4 ); // just an example
ret += i;
}
return ret;
这不是 constexpr。丑陋的例子:
auto ret = 0;
ret += 1;
ret += 2;
ret += 3;
return ret; // works
【问题讨论】:
-
我不关注;你能举一个丑陋的手工版本的例子吗?
-
constexpr函数已经可以使用 for 循环。你需要什么它没有给你? -
@NathanOliver 使用
i作为模板参数; -
@cigien 添加了一些示例代码