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問題は、クラスを組み合わせて、同時に 2 つ以上のバイアスを適用したい場合はどうすればよいかということです。この簡単な問題を過度に複雑にしたくはありませんが、デコレータを使用できるかもしれません。問題は、すべてのデコレータ クラスが から継承する必要があることCalibrationInputsです。

この問題に適した設計は何ですか?

4

1 に答える 1

0

金曜日にしばらくこの質問について考えましたが、さまざまな方法で機能する本当に良い解決策を見つけることができませんでした。バインダー(std :: mem_fn、boost.Bind boost.Phoenix)を使用して、メンバーを関数オブジェクトに変換することをお勧めします。この手順の後、次を作成できます。

  • これらの「メンバー」を均一に渡すためのポリモーフィック関数オブジェクト(std :: function、boost.Function)
  • テンプレートでこれらの関数オブジェクトを使用して、それらを組み合わせ、より複雑な関数オブジェクトを作成します。

バイアスタイプの追加のランタイム構成が必要な場合は、boost.Spiritを使用して一種のインタープリターを実装することを考えることができます。これがお役に立てば幸いです。

于 2013-02-11T12:59:01.523 に答える