如何推导嵌套容器值类型

时间:2016-05-13 09:19:27

标签: c++ templates c++11 containers

我有一个存储另一个容器的容器。我需要在嵌套容器的值上为这个容器创建一个迭代器。这个迭代器应该定义一个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功能。

2 个答案:

答案 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]);
}

Live Demo