【发布时间】:2021-05-13 13:04:58
【问题描述】:
我有一个class A,它实现了一个函数foo,它将两个迭代器(来自任何stl 容器)作为参数。就我所见,常用的方法是使用模板,如下所示:
class A{
public:
template <typename It>
void foo(const It& begin, const It& end){
// do stuff
}
};
问题是我想将foo 设为虚拟和templates may not be virtual,但我不想拥有这样的类模板:
template <typename It>
class A{
public:
void foo(const It& begin, const It& end){
// do stuff
}
};
因为这会将foo 在单个对象中的使用限制为一种容器。
我的问题:有没有办法在不使用模板的情况下使用 STL 迭代器作为参数,这样就可以使这些函数成为虚拟函数并使其与任何 STL 容器一起工作?
编辑
可能这就是cmets中说的XY问题,所以我来解释一下具体问题,看看大家怎么想。
我有一个名为LightSource 的抽象类,它带有一个纯虚函数void castLight(...) = 0。有两个类继承自它并实现了该功能,RadialLight 和 DirectedLight。
问题在于,要投射光,我需要一组对象 Edge,它们指定 2D 世界中的片段,这些片段可能会投射阴影。对于castLight 中的算法,我需要遍历该集合(不一定是全部),并在每种光线下进行某些不同的处理。
【问题讨论】:
-
有一些丑陋的变通方法,尽管这听起来像是 XY 问题。模板是编译时多态性的一种形式。虚函数是运行时多态性。
-
或许你可以问一下,你认为需要虚拟模板函数的问题怎么解决?
-
@fabian 这看起来是个好方法,但我不确定它是否适用于这种情况。我将编辑问题以更具体地解决问题
-
收藏是什么?您应该能够使用: void foo(std::vector
::const_iterator begin, ... 如果您想将迭代器“限制”到特定集合。注意:您不希望在迭代器之前使用 const ,您很可能需要 const_iterator。 -
@Zlatomir 我会考虑到这一点,谢谢。我想我将不得不将迭代器限制为某些集合......
标签: c++ templates iterator virtual-functions