【问题标题】:Having problem with implementing a chain class (chaining two containers)实现链类有问题(链接两个容器)
【发布时间】:2019-06-16 15:54:50
【问题描述】:

我写了一个“范围类”(获取作为输入开始和结束索引)并输出它们之间的所有元素(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

【问题讨论】:

    标签: c++ iterator


    【解决方案1】:

    不,您不能访问外部类字段。子类对其外部类具有友元式访问权限,但没有状态访问权限。如果你想要一个指向它们的外部类的指针,你必须添加一个。

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

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

    与 Java/C# 中的泛型不同,C++ 中的模板不是继承的运行时多态性。模板生成类型和函数。生成的类型和函数在运行时是不相关的,除非您当然将它们关联起来。

    有很多方法可以解决您的问题,从提升任何迭代器到有趣的手动类型,消除可迭代和可打印的概念,甚至是可打印的可迭代。我不知道你会明智地尝试你的 C++ 专业水平。

    【讨论】:

    • 您好,感谢您的帮助。如果我知道容器的类型相同,例如:chain(range('a', 'f'),string("hello"),我可以做些什么?
    • @hodiya 提升任何迭代器。请注意,这不会是高效的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多