返回值检查
比如在启动服务器或者客户端的时候编写init函数, 此时需要依次去config目录加载对应的配置,log的配置等等,在这个时候如果一行行写的话就会有如下代码:
error_t result{};
result = check1(…);
if (result != error_t::ok) {
return result;
}
result = check2(…);
if (result != error_t::ok) {
return result;
}
result = check3(…);
if (result != error_t::ok) {
return result;
}
result = check4(…);
if (result != error_t::ok) {
return result;
}
return error_t::ok;
虽说也可以但是终归是比较丑陋,如果应用折叠表达式的话可以写成如下形式:
return checked_exec(
error_t::ok,
[&] { return check1(…); },
[&] { return check2(…); },
[&] { return check3(…); },
[&] { return check4(…); });
对应的check_exec可以写成:
template <typename R,
typename... Fn>
R checked_exec(const R& expected,
Fn&&... fn)
{
R result = expected;
(void)(((result = forward<Fn>(
fn)()) == expected) &&
...);
return result;
}
当然,前提是不传入参数,传入参数不同的话就需要额外编写。