有没有办法在没有模板的情况下使用 STL 迭代器作为参数?
Is there a way to use STL iterators as arguments without a template?
我有一个 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,但我 不想 class 模板 像这样:
template <typename It>
class A{
public:
void foo(const It& begin, const It& end){
// do stuff
}
};
因为这会将 foo
在单个对象中的使用限制为一种容器。
我的问题:有没有办法在不使用模板的情况下使用 STL 迭代器作为参数,这样就可以使此类函数成为虚拟函数并使其与任何 STL 容器一起工作?
编辑
可能这就是评论说的XY问题,所以我就具体问题来解释一下,看大家怎么看。
我有一个名为 LightSource
的抽象 class,带有纯虚函数 void castLight(...) = 0
。有两个class继承它并实现了功能,RadialLight
和DirectedLight
。
问题是要投射光线,我需要一组对象 Edge
来指定 2D 世界中可能投射阴影的片段。对于 castLight
中的算法,我需要遍历该集合(不一定是所有集合)并进行某些在每种光线下都不同的处理。
您可以使用特定的迭代器类型,例如std::vector<int>::iterator
。请注意,这可能与 std::vector<int>::const_iterator
、std::deque<int>::iterator
和 std::vector<unsigned>::iterator
不同,因此您最终可能会遇到大量重载。
您还可以使用类型擦除迭代器,例如来自 boost::any_range
的迭代器或 any_range
本身。
我有一个 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,但我 不想 class 模板 像这样:
template <typename It>
class A{
public:
void foo(const It& begin, const It& end){
// do stuff
}
};
因为这会将 foo
在单个对象中的使用限制为一种容器。
我的问题:有没有办法在不使用模板的情况下使用 STL 迭代器作为参数,这样就可以使此类函数成为虚拟函数并使其与任何 STL 容器一起工作?
编辑
可能这就是评论说的XY问题,所以我就具体问题来解释一下,看大家怎么看。
我有一个名为 LightSource
的抽象 class,带有纯虚函数 void castLight(...) = 0
。有两个class继承它并实现了功能,RadialLight
和DirectedLight
。
问题是要投射光线,我需要一组对象 Edge
来指定 2D 世界中可能投射阴影的片段。对于 castLight
中的算法,我需要遍历该集合(不一定是所有集合)并进行某些在每种光线下都不同的处理。
您可以使用特定的迭代器类型,例如std::vector<int>::iterator
。请注意,这可能与 std::vector<int>::const_iterator
、std::deque<int>::iterator
和 std::vector<unsigned>::iterator
不同,因此您最终可能会遇到大量重载。
您还可以使用类型擦除迭代器,例如来自 boost::any_range
的迭代器或 any_range
本身。