【问题标题】:Is there a way to use STL iterators as arguments without a template?有没有办法在没有模板的情况下使用 STL 迭代器作为参数?
【发布时间】: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。有两个类继承自它并实现了该功能,RadialLightDirectedLight

问题在于,要投射光,我需要一组对象 Edge,它们指定 2D 世界中的片段,这些片段可能会投射阴影。对于castLight 中的算法,我需要遍历该集合(不一定是全部),并在每种光线下进行某些不同的处理。

【问题讨论】:

  • 有一些丑陋的变通方法,尽管这听起来像是 XY 问题。模板是编译时多态性的一种形式。虚函数是运行时多态性。
  • 或许你可以问一下,你认为需要虚拟模板函数的问题怎么解决?
  • @fabian 这看起来是个好方法,但我不确定它是否适用于这种情况。我将编辑问题以更具体地解决问题
  • 收藏是什么?您应该能够使用: void foo(std::vector::const_iterator begin, ... 如果您想将迭代器“限制”到特定集合。注意:您不希望在迭代器之前使用 const ,您很可能需要 const_iterator。
  • @Zlatomir 我会考虑到这一点,谢谢。我想我将不得不将迭代器限制为某些集合......

标签: c++ templates iterator virtual-functions


【解决方案1】:

您可以使用特定的迭代器类型,例如std::vector&lt;int&gt;::iterator。请注意,这可能与 std::vector&lt;int&gt;::const_iteratorstd::deque&lt;int&gt;::iteratorstd::vector&lt;unsigned&gt;::iterator 不同,因此您最终可能会遇到大量重载。

您还可以使用类型擦除迭代器,例如来自boost::any_rangeany_range 本身的迭代器。

【讨论】:

  • 所以唯一的办法就是限制容器的类型并重载……嗯,谢谢!
猜你喜欢
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2016-01-10
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多