如何利用单个三元运算符返回多个值并简化多变量赋值
合并多条条件赋值语句的可行方案
当然可以!而且这么做不仅能让代码更整洁,还能避免多次调用GetBoolValue()可能带来的隐患——比如如果这个函数的返回值依赖外部状态(不是固定结果),三次调用可能得到不同结果,导致x、y、z的逻辑不一致。
下面是几种实用方案,按可读性和实用性排序:
方案1:缓存布尔值(最直观易读,推荐首选)
先把GetBoolValue()的结果存起来,再统一给三个变量赋值,这是最通用的方式,代码清晰且无额外复杂度:
bool boolResult = GetBoolValue(); int x = boolResult ? 0 : 1; string y = boolResult ? "foo" : "bar"; float z = boolResult ? 0.4f : 0.5f;
方案2:结构化绑定(C++17及以上适用,紧凑简洁)
如果想让代码更紧凑,可以结合lambda和结构化绑定,一次性完成所有赋值:
#include <tuple> #include <string> // 一行完成赋值逻辑 auto [x, y, z] = [](bool b) { return std::make_tuple(b ? 0 : 1, b ? std::string("foo") : std::string("bar"), b ? 0.4f : 0.5f); }(GetBoolValue());
这种方式能把逻辑收拢到一处,但可读性略逊于方案1,适合追求代码简洁的场景。
方案3:自定义结构体(扩展性更强)
如果后续可能需要增加更多关联变量,自定义一个结构体封装这些值会让代码更具可读性和维护性:
#include <string> struct ResultSet { int x; std::string y; float z; }; ResultSet getValues(bool b) { return {b ? 0 : 1, b ? "foo" : "bar", b ? 0.4f : 0.5f}; } // 调用时直接解构获取变量 auto [x, y, z] = getValues(GetBoolValue());
这种方式把赋值逻辑封装成独立函数,代码职责更清晰,后续修改或扩展都更方便。
总的来说,方案1是平衡可读性和简洁性的最优选择;如果追求极致紧凑或者需要长期扩展性,再考虑方案2或3。
内容的提问来源于stack exchange,提问作者AustinWBryan
相关产品推荐
相关产品推荐

