私はポリシーベースの設計原則にあまり詳しくありませんが (申し訳ありません)、あなたの問題を読んだとき、それを解決するために (インターフェイスとして) 純粋な仮想クラスのようなものが必要だと感じました。
問題は、事前に宣言されていない場合、他のものを使用できないということです。これが基本的なルールです。したがって、FitnessPolicy に使用するメンバがいくつかあることを SelectPolicy に伝えるには、仮想インターフェイスを使用する必要があります。例に従って、必要に応じてアルゴリズムを変更してください。
最初に、SelectionPolicy と FitnessPolicy のインターフェースを作成します。
template <class T> class FitnessPolicyBase
{
public:
virtual int Fitness(T fitnessSet); // assuming you have implemented the required classes etc. here - return value can be different of course
...
} // write your other FitnessPolicy stuff here
template <class T> class SelectionPolicyBase
{
public:
virtual T Selector(FitnessPolicyBase<Solution> evaluator, Set<T> selectionSet); // assuming such a set exists here
...
} // write your other selectionpolicy interface here
さて、これらのクラスを純粋仮想 (仮想関数しか持たない) にしたので、それらを使用することはできず、継承するだけです。これはまさに私たちが行うことです: SelectionPolicy クラスと FitnessPolicy クラスはそれぞれから継承されます:
class SelectionPolicy: public SelectionPolicyBase<Solution> // say, our solutions are of Solution Type...
{
public:
virtual Solution Selector(FitnessPolicyBase<Solution> evaluator, Set<Solution> selectionSet); // return your selected item in this function
...
}
class FitnessPolicy : public FitnessPolicy Base<Solution> // say, our solutions are of SolutionSet Type...
{
public:
virtual int Fitness(Solution set); // return the fitness score here
...
}
ここで、アルゴリズムは、SolutionSetBase と FitnessSetBase の 2 種類のパラメーターで実行できます。xxxBase 型は本当に必要だったのでしょうか? 実際には、SolutionPolicy クラスと FitnessPolicy クラスのパブリック インターフェイスがある限り、それらを使用できます。しかし、この方法を使用して、「ロジック」を問題から分離しました。
これで、Selection Policy アルゴリズムはポリシー クラスへの参照を取得し、必要な関数を呼び出すことができます。ここで、ポリシー クラスは互いのクラスを呼び出すこともできることに注意してください。したがって、これは現在有効な状況です。
virtual Solution SelectionPolicy::Selector(FitnessPolicyBase<Solution> evaluator, Set<T> selectionSet)
{
int score = evaluator.Fitness(selectionSet[0]); //assuming an array type indexing here. Change accordingly to your implementation and comparisons etc.
}
ただし、これが機能するためには、FitnessPolicy オブジェクトを初期化し、それをこのセレクターに渡す必要があります。アップキャストと仮想機能により、正常に動作します。
私が物事を複雑にしすぎていた場合はご容赦ください - 私は最近 C++ から少し離れていたので (最近 C# に取り組んでいます)、構文を何かと間違えたかもしれませんが、ロジックはとにかく同じである必要があります。