类型衰减Stl迭代器

时间:2018-12-09 11:38:13

标签: c++ stl

假设我有一个返回一定范围值的接口。该接口的实现可能使用不同的容器来提供这些数字。

     var count = 0;  
    [
        ["1", "X5CrNi18", "0", "55", "0", "Steel"],
        ["2", "X5CrNi18", "100", "55", "0.5", "Steel"],
        ["6", "S355J2Q +Z35", "100", "20", "0.68", "Steel"],
        ["8", "S355J2Q +Z35", "300", "20", "0.3", "Steel"],
        ["count++", "text value from text input", "value from input Num 1", "0", "value from input Num 2", "Just some default text"],
        ["count++", "text value from text input", "value from the next input Num 1", "0", "value from the next input Num 2", "Just some default text"]
]

我想知道是否有一种方法可以使容器类型远离迭代器。

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;
}

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

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

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

1 个答案:

答案 0 :(得分:0)

似乎已经有了答案。 “ 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