在实现链类时遇到问题(将两个容器链接在一起)

时间:2019-06-16 15:54:50

标签: c++ iterator

我写了一个'range-class'(作为输入的起始索引和结束索引)并输出它们之间的所有元素(int,char,double等)。 我在实现“链类”时遇到问题,链需要两个容器(范围类或字符串)并将其链接。问题是开始和结束类无法识别内部类类型。

范围类的实现:

template<typename T> 
struct RangeClass{
  T start, last;

  RangeClass(T first, T last): start(first), last(last) { };

  struct iterator{ //inner class

    T it; 

    T operator* (){ return it;
    iterator& operator++() { ++it; return *this; }

    bool operator== (const iterator& other){ return it==other.it; }
    bool operator!= (const iterator& other){ return it!=other.it; }
  }; // end Iterator

  iterator end() const{ return iterator{last}
  iterator begin() const{ return iterator{start};}

}; // end RangeClass

template<typename T>
RangeClass<T> range(T first, T last){ 
  return RangeClass(first, last);
}

ChainClass是:

template <typename T, typename V>
struct ChainRanges{

  T t1;
  V v1;

  ChainRanges (const T& first, const V& second):
    t1(first), v1(second)
  {}

  template<typename Y>
  struct iterator{

    Y var;

    Y operator* (){ return var; }

  iterator& operator++(){//right? can access outer class fields?
    if(var==*it.end())
      var=*v1.begin();
   else
      ++var;


    bool operator== (const iterator& other){ return var==other.var; }
    bool operator!= (const oiterator& other){ return var!=other.var; }

  }; // end Iterator


  auto end() const {
    //auto? or iterator<Y> 
    auto var = ( *(v1.end()) ) ;
    return iterator{var};
  }

  auto begin() const{
    auto var = ( *(t1.begin()) ) ;
    return iterator{var};
  }
}; // end struct chain

template<typename T, typename V>
ChainRanges<T,V >
chain(T first, V second)
{
  return ChainRanges(first, second);
}

主要是:

for (int i: range(5,9))
  cout << i;  //prints 5678

for (char i: chain(range('a','e'), string("hello")))
  cout << i;//want this to work =   // abcdhello

1 个答案:

答案 0 :(得分:0)

否,您不能访问外部类字段。子类对其外部类具有朋友样式的访问权限,但没有状态访问权限。您想要一个指向其外部类的指针时,必须添加一个。

值在C ++中具有固定的类型。您不能具有两种可能的类型的迭代器值。

如果两个可能的类型共享一个basr类,则可以使用它们的指针。您可以使用类型擦除将多个类型包装到一个变量中。您可以使用std变体,std any,void指针和仔细的手动vtable,由常规类型抽象包装的概念和模型模板,或使用多种其他方法来获得“多个类型的value。”;它们实际上不是多个类型的值,而只是包含某些类型感知调度代码的多态行为值。

与Java / C#中的泛型不同,模板在C ++中不是继承的运行时多态。模板生成类型和功能。生成的类型和函数在运行时是不相关的,除非您使它们相关。

有很多方法可以解决您的问题,从增强任何迭代器到有趣的手动类型,消除可迭代和可打印甚至可打印迭代的概念。我不知道您应该尝试自己的C ++专业知识。