【问题标题】:Type decaying stl iterator类型衰减 stl 迭代器
【发布时间】:2018-12-09 11:38:12
【问题描述】:

假设我有一个返回一系列值的接口。这个接口的实现可以使用不同的容器来提供这些数字。

class MyClassI
{
public:
  virtual std::pair<std::vector<int>::iterator, std::vector<int>::iterator> Numbers() const = 0;
}

class MyClassC : public MyClassI
{
public:
  virtual std::pair<std::vector<int>::iterator, std::vector<int>::iterator> Numbers() const 
     { return std::make_pair(numbers.begin(), numbers.end(); }
private:
   std::vector<int> numbers;
}

我想知道是否有办法将容器类型从迭代器中“衰减”掉。

class MyClassI
{
public:
  virtual std::pair<decayed_iterator<int>, decayed_iterator<int>> Numbers() const = 0;
}

我当然可以将原始迭代器放在堆上,然后我可以用模板类包装该指针,以提供值类型作为迭代器。

我想知道在 boost 中是否已经有类似的东西或其他东西。

我可以想象像 std/boost 函数这样的东西,其中可调用对象被衰减(如果它是函数或结构),并且“状态”部分存储在对象内部(如果它足够小),以避免堆分配- 如果可能的话。

【问题讨论】:

  • 你的意思是多态迭代器类型吗?换句话说,一个迭代器基类(或基类模板)和不同容器类型的不同派生迭代器?
  • 是的。它类似于 C# 中的 IEnumerator,因此它不会泄露比需要更多的实现细节(容器类型)。我需要它,以便可以将其用作方法返回值或将其用作方法参数。最好我不想让这些方法成为模板函数。
  • 你可以创建它!基类和派生类模板......

标签: c++ stl


【解决方案1】:

看来 boost 已经有了答案。 “Range”库提供了一个范围适配器(boost::adaptors::type_erased),它会衰减容器或其他已应用的适配器。所以我们最终得到了一个boost::any_range,它在迭代类型的旁边还有一些其他的参数,但没有更多的容器

https://www.boost.org/doc/libs/1_69_0/libs/range/doc/html/range/reference/adaptors/reference/type_erased.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2017-06-23
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多