gpt4 book ai didi

C++单个变量来处理来自用户的多个类

转载 作者:行者123 更新时间:2023-11-28 04:34:10 24 4
gpt4 key购买 nike

我正在尝试用 C++ 编写一个数值优化器,允许用户指定他们想要使用的输入类型。输入都具有相同的“API”样式,其中所有类都具有相同名称的方法。示例(只显示部分代码,因为完整的细节并不重要):

OLS::OLS(int num_data_cols, float learning_rate, int num_epochs){

learningRate = learning_rate;
numEpochs = num_epochs;
numDataCols = num_data_cols;

// Generate Random Beta Start point
for (int i=0; i<numDataCols; i++){
beta.push_back( float(rand()%10)/float(rand()%10) );
}
intercept = float(rand()%10)/float(rand()%10);
}

void OLS::updateParameters(float target, vector<float> data)
{
float prediction = makePrediction(data);
float error = getError(target, prediction);
for (int i=0; i<numDataCols; i++){
beta.at(i) = beta.at(i) - learningRate*error*data.at(i);
}
intercept = intercept - learningRate*error;
}
...

还有另一个名为 Hinge 的类,它具有所有相同的方法。我希望用户能够通过命令行指定在求解器中使用这些类中的哪些。

但是,我不确定如何指定存储“要优化的类”对象的变量。目前,我将其作为另一个围绕优化器的类:

class GradientDescent {

private:

...
...
OLS* cost_function;
...
...

public:

GradientDescent(OLS objectHere);
GradientDescent(Hinge objectHere);
...
...
}

您可以看到两件事 - 我已重载以允许用户选择要使用的对象类型。但是,cost_function 预先指定为 OLS 对象。我想要的行为是 cost_function 被指定为类对象,但我不想预先指定它是 OLS。我想让用户告诉我他们想要哪些优化器,然后将该对象及其子结构存储在名称 cost_function 下。

我如何转发声明 cost_function 以便它在使用的类的构造函数中接受 OLSHinge 对象用户请求的优化?我有一种使用用户输入来选择优化器的方法,我并不担心,我只需要知道如何处理多种可能的类型。

最佳答案

这不是虚拟继承的情况吗?

#include <vector>
#include <memory>

// engine concept
struct Engine
{
virtual void updateParameters(float target, std::vector<float> data) = 0;

virtual ~Engine() = default;
};

struct OLS: Engine
{
virtual void updateParameters(float target, std::vector<float> data) override;
};

struct Hinge : Engine
{
virtual void updateParameters(float target, std::vector<float> data) override;
};



struct Solver
{
void useOLS() {
engine_ = std::make_unique<OLS>();
}

void useHinge() {
engine_ = std::make_unique<Hinge>();
}

void updateParameters(float target, std::vector<float> data)
{
engine_->updateParameters(target, data);
}


std::unique_ptr<Engine> engine_;
};

另一种选择是使用 boost::variant 来保持引擎(成本函数)并使用访问者来更新其参数。

关于C++单个变量来处理来自用户的多个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51993961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com