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

标签 c++

我正在尝试用 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/

相关文章:

c++ - C++ 中的编译时类型替换

c++ - 我应该使用全局变量还是每次都调用该函数? C++

c++ - 无穷大的 float 是否满足这些方程?

c++ - 解决参数依赖查找歧义的非侵入性方法

c++ - boost Python : polymorphic container?

C++ 整数后跟 char 被接受为输入

c++ - VK_CONTROL/VK_MENU/VK_SHIFT 的默认值

c++ - 结构的无符号字符别名

c++ - Visual Studio 似乎不认为它是在 64 位中编译的

c++ - 如何在 C++ 中同时写入和读取文件