継承シナリオでのポインターとテンプレートの間の最適なソリューションは何かを理解しようとしています。
次のクラスを検討してください。
class Event
{
};
class Filter
{
public:
virtual void process(Event *event) = 0;
};
class Pipeline
{
private:
std::vector<Filter*> _filters
};
各ユーザーは、Event クラスと Filter クラスを展開して、実際のデータと実際のフィルタリング関数を保持できます。パイプライン クラスは、フィルターをキューで接続し、メソッド プロセスを実行するだけです。
これまでは、継承を処理するために常にポインターを使用していました。たとえば、フィルター ポインターの std::vector と、イベント ポインターを受け取るプロセス関数です。ポインターの代わりにテンプレートを使用できますか?
例えば
class Event
{
};
template<class Event> class Filter
{
public:
virtual void process(Event *event) = 0;
};
template<class Filer> class Pipeline
{
private:
std::vector<Filter> _filters
};
これは機能しますか、それは可能ですか?主な意味は何ですか?
議論すべき別の例があります。次のコードを検討してください。
template<class Element, class Cluster>
Cluster* closestCluster(Element *e, std::vector<Cluster*> &clusters)
{
double minDist = clusters[0]->distance(e);
Cluster *c = clusters[0];
for(std::size_t i = 1 ; i < clusters.size(); ++i)
{
double tmp = clusters[i]->distance(e);
if(tmp < minDist)
{
minDist = tmp;
c=clusters[i];
}
}
return c;
}
Cluster* closestCluster(Element *e, std::vector<Cluster*> & clusters)
{
double minDist = clusters[0]->distance(e);
Cluster *c = clusters[0];
for(std::size_t i = 1 ; i < clusters.size(); ++i)
{
double tmp = clusters[i]->distance(e);
if(tmp < minDist)
{
minDist = tmp;
c=clusters[i];
}
}
return c;
}
一見すると機能的にはこう見えますが、大きな違いはありません。しかし、私のコードでは最初のものだけが機能します。私のクラスターの配列はこのタイプであるため:
std::vector<KMedoidCluster*> &clusters
コンパイラは KMedoidclsuter が基本クラス Cluster の拡張であることを理解できると思いました。しかし、どうやらうまくいかないので、ある程度の柔軟性を得るために、テンプレートを使用する必要がありました。