假设我想使用以下语法创建自己的基于lambda的开关:
auto s = make_switch(std::pair{0, []{ return 0; }},
std::pair{1, []{ return 50; }},
std::pair{2, []{ return 100; }});
assert( s(0) == 0 );
assert( s(1) == 50 );
assert( s(2) == 100 );
我想使用折叠表达式来获得不需要递归的简洁实现。这个想法是生成类似于一堆嵌套if
语句的东西:
if(x == 0) return 0;
if(x == 1) return 50;
if(x == 2) return 100;
我想写这个:
// pseudocode
template <typename... Pairs>
auto make_switch(Pairs... ps)
{
return [=](int x)
{
( if(ps.first == x) return ps.second(), ... );
};
}
上面的代码不起作用,因为if(...){...}
它不是表达式。然后我尝试使用&&
运算符:
template <typename... Pairs>
auto make_switch(Pairs... ps)
{
return [=](int x)
{
return ((ps.first == x && ps.second()), ...);
};
}
这确实编译,但返回的结果ps.first == x && ps.second()
是 abool
而不是int
我想要的值。
我想要某种运算符,它是逗号运算符和之间的组合:如果左侧计算&&
为 ,它应该计算并计算到运算符的右侧。true
我想不出任何技术可以让我以这样的方式实现它,我可以获得ps.second()
的返回值并将其传播给 . 返回的 lambda 的调用者make_switch
。
是否可以使用折叠表达式实现这种“级联if
s”模式?在找到匹配的分支之前,我只想评估所需数量的表达式。