【发布时间】:2013-11-14 12:07:28
【问题描述】:
我试图了解在继承场景中指针和模板之间的最佳解决方案是什么。
考虑以下类。
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 的扩展。但显然它不起作用,所以为了获得一些灵活性,我不得不使用模板。
【问题讨论】:
-
std::vector<Filter>和Filter具有虚函数的事实不能很好地结合在一起。 -
那么 std::vector
是更好的选择吗? -
我只是想掌握模板的优点以及何时使用它
标签: c++ templates pointers inheritance