我试图了解在继承场景中指针和模板之间的最佳解决方案是什么。
考虑以下类。
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 的扩展。但显然它不起作用,所以为了获得一些灵活性,我不得不使用模板。