我有一个存储另一个容器的容器。我需要在嵌套容器的值上为这个容器创建一个迭代器。这个迭代器应该定义一个operator*
,但我不知道要返回的嵌套容器的值类型。我不能保证容器有任何typedef
的值。唯一给出的是每个容器都有一个合适的operator[]
。如何声明operator*
?
template<typename ContainerType>
struct MyIterator{
MyIterator(ContainerType& container, int32 indexA = 0, int32 indexB = 0)
: Container(container)
, IndexA(indexA)
, IndexB(indexB)
{}
// NestedValueType needs to be replaced or declared somehow
NestedValueType& operator* ()
{
return Container[IndexA][IndexB];
}
private:
ContainerType& Container;
int32 IndexA;
int32 IndexB;
};
P.S。我只有C ++ 11功能。
答案 0 :(得分:3)
您可以使用decltype
:
auto operator*() -> decltype(Container[IndexA][IndexB])
{
return Container[IndexA][IndexB];
}
为此,您应该将数据成员从类的底部移动到顶部。 See this answer for the reason why
另一种方法是在每个数据成员访问(this->
)之前放置decltype(this->Container[this->IndexA][this->IndexB])
。
答案 1 :(得分:2)
如果您的编译器支持C ++ 14,则一种解决方案是以下列方式使用decltype(auto)
:
decltype(auto) operator* () {
return (Container[IndexA][IndexB]);
}