You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用std::optional包装结构体的数据成员类型?

问题需求

给定如下结构体定义:

struct Params {
   int member1;
   std::string member2;
   int member3 = 42;
   std::shared_ptr<std::string> member4;  
};

希望将该结构体的每个成员类型用std::optional包装,得到如下结构体:

struct MaybeParams {
   std::optional<int> member1;
   std::optional<std::string> member2;
   std::optional<int> member3;
   std::optional<std::shared_ptr<std::string>> member4;
};

实际场景限制

  • Params是另一个类的私有结构体,包含约50个数据成员,无法修改其定义
  • 要求采用纯C++20方案(禁止使用Boost库)

核心目标

实现一个通用函数,能够基于原对象生成仅修改部分成员的副本,功能类似Python中默认值为None的命名关键字参数。原本以为需要C++反射特性才能实现,希望找到可行的替代方案。

补充背景

需要MaybeParams配合指定初始化列表实现modifiedCopy函数,示例代码如下:

class MyClass {
public:
  MyClass(const Params& pars): _pars(pars) {...}
  // ... 其他成员函数
private:
  Params _pars;
  // 需在内部定义MaybeParams类型
  struct MaybeParams {
     std::optional<int> member1;
     std::optional<std::string> member2;
     std::optional<int> member3;
     std::optional<std::shared_ptr<std::string>> member4;
  };
};

const MyClass modifiedCopy(const MyClass& reference, const MyClass::MaybeParams& what_to_modify);

int main() {
   const auto m1 = MyClass{.member1 = 1, .member2="ABC"};
   const MyClass m2 = modifiedCopy(m1, {
      .member2 = "XYZ",   
      .member4 = std::make_shared<std::string>("XXX")
   });
}

注:认同理想情况下应减少类的数据成员或进行重构,但当前需优先解决该问题。


内容的提问来源于stack exchange,提问作者Adam Ryczkowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:35:08