0

我有这样的结构:

struct CalibrationInputs {
  float eta;
  float rawcl_Es0;
  float rawcl_Es1;
  float rawcl_Es2;
  float rawcl_Es3;
};

这是一个大函数的输入

float calibrate(CalibrationInput inputs)

我想calibrate使用偏差输入来应用函数,所以我需要一种方法来修改CalibrationInputs. 这是一项简单的任务,但我想以一种好的方式完成它。我现在正在做的是:

class BiasBase
{
public:
    BiasBase(float amount, std::string type) : m_amount(amount), m_type(type) { };
    virtual void bias(CalibrationInputs & calibration_inputs) = 0;
    std::string get_name() const { return m_type + "_" + get_amount_string(); };
    float get_amount() const { return m_amount; };
protected:
    float m_amount;
    std::string m_type;
};

class BiasE2 : public BiasFixed
{
  BiasE2(float amount) : BiasFixed(amount, "E2") { };
  void bias(CalibrationInputs & calibration_inputs) {
    calibration_inputs.rawcl_Es2 *= (1 + m_amount);
  }
};

class BiasE1 ...
class VeryComplexBias ...
class RandomBiasE2 ...

我将它们用作:

CalibrationInput input;
CalibrationInput input_bias_e1 = input;
...
BiasE1 bias_e1(0.01);
bias_e1.apply_bias(input_bias_e1);
float result = calibrate(input);
float result_bias_e1 = calibrate(input_bias_e1);
...

问题是:如果我想组合这些Bias类,同时应用两个或多个偏差怎么办?我不想让这个简单的问题过于复杂,但也许我可以使用装饰器。问题是每个装饰器类都需要继承自CalibrationInputs,所以我每次都在复制字段,不是吗?

这个问题有什么好的设计?

4

1 回答 1

0

星期五我想了一会儿这个问题,但我找不到一个真正好的解决方案,它可以以各种方式工作。我建议使用活页夹 (std::mem_fn, boost.Bind boost.Phoenix) 将您的成员转换为函数对象。完成此步骤后,您可以创建:

  • 多态函数对象(std::function, boost.Function)以统一的方式传递这些“成员”
  • 在模板中使用这些函数对象来组合它们并创建更复杂的函数对象。

如果您需要额外的偏差类型运行时配置,您可以考虑使用 boost.Spirit 实现一种解释器。我希望这有帮助。

于 2013-02-11T12:59:01.523 回答