我写了一个'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
答案 0 :(得分:0)
否,您不能访问外部类字段。子类对其外部类具有朋友样式的访问权限,但没有状态访问权限。您想要一个指向其外部类的指针时,必须添加一个。
值在C ++中具有固定的类型。您不能具有两种可能的类型的迭代器值。
如果两个可能的类型共享一个basr类,则可以使用它们的指针。您可以使用类型擦除将多个类型包装到一个变量中。您可以使用std变体,std any,void指针和仔细的手动vtable,由常规类型抽象包装的概念和模型模板,或使用多种其他方法来获得“多个类型的value。”;它们实际上不是多个类型的值,而只是包含某些类型感知调度代码的多态行为值。
与Java / C#中的泛型不同,模板在C ++中不是继承的运行时多态。模板生成类型和功能。生成的类型和函数在运行时是不相关的,除非您使它们相关。
有很多方法可以解决您的问题,从增强任何迭代器到有趣的手动类型,消除可迭代和可打印甚至可打印迭代的概念。我不知道您应该尝试自己的C ++专业知识。