c++ - 有没有办法在没有模板的情况下使用 STL 迭代器作为参数?
问题描述
我有一个class A
实现一个函数,该函数foo
将两个迭代器(来自任何 stl 容器)作为参数。对于我所看到的,常见的方法是使用模板,如下所示:
class A{
public:
template <typename It>
void foo(const It& begin, const It& end){
// do stuff
}
};
问题是我想做foo
虚拟,模板可能不是虚拟的,但我不想有这样的类模板:
template <typename It>
class A{
public:
void foo(const It& begin, const It& end){
// do stuff
}
};
因为这会将foo
单个对象中的使用限制为一种容器。
我的问题:有没有办法在不使用模板的情况下使用 STL 迭代器作为参数,这样就可以使这些函数成为虚拟函数并使其与任何 STL 容器一起工作?
编辑
也许这是评论中所说的XY问题,所以我将解释具体问题,看看您的想法。
我有一个LightSource
用纯虚函数调用的抽象类void castLight(...) = 0
。有两个类继承自它并实现了该功能,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
自身。
推荐阅读
- sql - 带权重的 SQL 表连接
- c++ - 请描述构造函数在 C++ 中的此类中定义的方式?
- javascript - Firebase:不起作用(.auth() 不是函数,未声明 firebase 等)
- java - 如何使用 Android 中 FirstActivity 中的数据填充 SecondActivity 上的 ListView?
- python - 使用 CFFI/Cython 使用 python 包装 C 代码
- typescript - 为什么 TypeScript 不能从过滤后的数组中推断类型?
- java - ServerSymmetricEngine 无法启动
- r - 将数据框中的多个列与另一个数据框中的特定值相乘
- python - 使用正则表达式验证输入
- linux - EGLFS QML 屏幕未旋转