C++ 如何简化带条件的std::optional结构体成员初始化逻辑
解决方案
首先修正你代码中的笔误:所有globalFoot均为全局变量名globalFoo的拼写错误。
以下两种实现均满足你的要求:保持入参为std::optional类型、全局变量类型不变,无需编写多分支if语句,每个成员的初始化逻辑独立维护。
方案1:单表达式初始化(兼容C++17及以上版本)
直接在结构体聚合初始化时对每个成员单独做判断,和你期望的语法形式最接近:
void Set(std::optional<int> x, std::optional<int> y) { globalFoo = FooBar{ .foo = x ? myObj1{*x} : myObj1{}, .bar = y ? std::make_optional<myObj2>(*y) : std::nullopt }; }
如果使用C++23及以上版本,可以用std::optional的transform方法进一步简化bar的赋值逻辑:
.bar = y.transform([](int v) { return myObj2{v}; })
方案2:分步赋值(逻辑更清晰,易扩展)
先默认构造FooBar实例,再对每个成员单独判断赋值,新增成员时只需新增一行判断逻辑即可,维护成本极低:
void Set(std::optional<int> x, std::optional<int> y) { FooBar fb; if (x) fb.foo = myObj1{*x}; if (y) fb.bar = myObj2{*y}; globalFoo = std::move(fb); }
该方案仅使用单条件独立判断,完全避免了你原有代码的多分支嵌套问题,运行逻辑和原代码完全一致。
内容的提问来源于stack exchange,提问作者user1936582
相关产品推荐
相关产品推荐

