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

关于优化参数类中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:37:24