我想了解繼承方案中指針和模板之間的最佳解決方案。C++繼承:模板Vs指針
考慮以下類。
class Event
{
};
class Filter
{
public:
virtual void process(Event *event) = 0;
};
class Pipeline
{
private:
std::vector<Filter*> _filters
};
每個用戶都可以擴展Event類和Filter類來容納實際的數據和實際的過濾函數。管道類只將過濾器與隊列連接起來並執行方法過程。
直到現在我總是用指針來處理繼承,例如, Filter指針的std :: vector以及接收Event指針的進程函數。而不是指針可以使用模板?
例如
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是基類集羣的擴展。但顯然它不起作用,所以爲了獲得一些靈活性,我不得不使用模板。
'std :: vector'和'Filter'具有虛擬功能的事實並不能很好地結合在一起。 –
dasblinkenlight
所以std :: vector是一個更好的選擇? –
mariolpantunes
是的。 Shooooooort – 2013-11-14 12:21:18