关于优化参数类中shared_ptr类型Setter函数的改进问询
简化Optimization类的参数设置方式
首先先提个小细节:你的代码里有个拼写错误——std::shared_ptr<Paramter>应该是std::shared_ptr<Parameter>(注意末尾的e),这个得先修正,不然编译会报错。
回到你的需求:不想每次调用setParameter都手动创建std::shared_ptr<Parameter>,希望更简便的调用方式。这里有几种实用的方案可以实现:
1. 重载setParameter方法,支持直接传入参数对象
你可以给setParameter增加几个重载版本,让它接受Parameter的左值、右值,甚至直接创建默认实例:
class Optimization { public: std::shared_ptr<Parameter> getParameter() const { return m_parameter; } // 原有的shared_ptr版本保留 void setParameter(const std::shared_ptr<Parameter>& parameter) { m_parameter = parameter; } // 接受左值引用,内部自动创建shared_ptr void setParameter(const Parameter& parameter) { m_parameter = std::make_shared<Parameter>(parameter); } // 接受右值引用,支持移动语义,更高效 void setParameter(Parameter&& parameter) { m_parameter = std::make_shared<Parameter>(std::move(parameter)); } // 无参数版本,直接创建默认构造的Parameter实例 void setParameter() { m_parameter = std::make_shared<Parameter>(); } private: std::shared_ptr<Parameter> m_parameter; // 修正拼写错误 };
这样调用的时候就可以这么用:
Optimization opt; // 直接传入默认构造的参数 opt.setParameter(); // 传入已有的Parameter对象 Parameter p; opt.setParameter(p); // 传入临时对象(自动触发右值版本) opt.setParameter(Parameter{10, 0.5}); // 假设Parameter有对应的构造函数
2. 用模板方法支持任意构造参数
如果Parameter有多种构造函数(比如带不同数量、类型的参数),可以写一个模板版本的setParameter,利用完美转发直接传递构造参数,一步创建shared_ptr:
class Optimization { public: // ... 保留其他方法 ... template<typename... Args> void setParameter(Args&&... args) { m_parameter = std::make_shared<Parameter>(std::forward<Args>(args)...); } private: std::shared_ptr<Parameter> m_parameter; };
调用示例:
// 假设Parameter有构造函数 Parameter(int, double) opt.setParameter(10, 0.5); // 假设Parameter有构造函数 Parameter(const std::string&) opt.setParameter("config_file.txt");
3. 优化构造函数,从源头简化初始化
除了setParameter,你还可以给Optimization增加几个构造函数,支持直接传入参数对象或者构造参数,这样初始化的时候就不用先创建对象再调用setParameter:
class Optimization { public: // 默认构造,自动创建默认Parameter Optimization() : m_parameter(std::make_shared<Parameter>()) {} // 接受shared_ptr的构造函数 explicit Optimization(std::shared_ptr<Parameter> parameter) : m_parameter(std::move(parameter)) {} // 接受左值参数对象 explicit Optimization(const Parameter& parameter) : m_parameter(std::make_shared<Parameter>(parameter)) {} // 接受右值参数对象 explicit Optimization(Parameter&& parameter) : m_parameter(std::make_shared<Parameter>(std::move(parameter))) {} // 模板构造函数,支持任意构造参数 template<typename... Args> explicit Optimization(Args&&... args) : m_parameter(std::make_shared<Parameter>(std::forward<Args>(args)...)) {} // ... 保留getParameter和setParameter方法 ... private: std::shared_ptr<Parameter> m_parameter; };
这样初始化的时候就可以直接写:
Optimization opt1; // 默认参数 Optimization opt2(10, 0.5); // 直接用Parameter的构造参数初始化 Parameter p; Optimization opt3(p); // 用已有的参数对象初始化
这些方案都能让你摆脱手动创建std::shared_ptr<Parameter>的繁琐,根据你的实际使用场景选一个最合适的就行~
内容的提问来源于stack exchange,提问作者user3726947
相关产品推荐
相关产品推荐

