如何用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
相关产品推荐
相关产品推荐

