什么是C ++中的std :: list <t> :: begin()的返回类型</t>

时间:2012-05-22 14:19:55

标签: c++ templates iterator

好的,我猜这个信息可以通过深入了解实现内容得出,这就是我在最后一天所做的事情:)

我的问题是我想要一个我的template<class T>(具有私有std::list<T>成员)的方法来包装......但我无法弄清楚这个方法的返回值是什么。

我的代码如下:


template <class T >
    class MyTemplate {
       std::list<T> myList;
       ...

       somereturnvaluehere myMethod(){
              return myList.begin();       
       }
       ...

}

由于

5 个答案:

答案 0 :(得分:8)

要么是

  • typename std::list<T>::iterator,(非const版本)
  • typename std::list<T>::const_iterator(const版本)

取决于myList是否是const对象,但在您的情况下,它似乎不是const对象,这意味着您应该使用第一个版本,非const版本。

在C ++ 11中,您不必担心它,就像您想要的那样,您可以使用尾随返回类型:

auto myMethod() -> decltype(myList.begin())
{
    return myList.begin();       
}

但是我认为,对于你的情况来说,这是过度的,事实上,使事情变得不必要地复杂化。所以我建议你不要用它;但只知道在C ++ 11中有一个叫做 trailing-return-type 的东西,在某些的情况下,它的用法可能是合理的。

答案 1 :(得分:7)

列表的begin将返回std::list<T>::iterator

在您的情况下,它将是一个依赖类型,因此somereturnvaluehere应该是

typename std::list<T>::iterator

答案 2 :(得分:3)

要么是

std::list<T>::iterator;

std::list<T>::const_iterator;

取决于您的列表是否为const。您可以像这样使用类中的类型:

struct Foo {
    typedef typename std::list<SomeType>::iterator iterator;
    typedef typename std::list<SomeType>::const_iterator const_iterator;

    iterator foo() { return m_list.begin();}
    const_iterator foo() const { return m_list.begin(); }

    std::list<SomeType> m_list;
};

答案 3 :(得分:1)

std::list<T>::begin()会返回std::list<T>::iteratorstd::list<T>::const_iterator,正如其他人所说的那样。

可能更重要的是你想从myMethod()函数中实现什么

如果您只是在std::list周围写一个薄的包装,那么我不确定我是否看到了这个值。理想情况下,您可以将列表封装在类中,以便不暴露其实现。

答案 4 :(得分:1)

正如其他人所说,它将是std::list<T>::iterator。但是为了呈现更清晰的API,并允许自己在将来更改这一点的灵活性,您可能希望定义自己的typedef(映射到std::list<T>::iterator)并将其用作返回类型。即:

template <class T >
    class MyTemplate {
       std::list<T> myList;
       typedef std::list<T>::iterator iterator;
       ...

       iterator myMethod(){
              return myList.begin();       
       }
       ...

}

在这里,我将typedef命名为iterator,这意味着您班级的用户会将其称为MyTemplate<T>::iterator - 但这取决于myMethod()的作用和细节在你的课程中,你可能想把它命名为更具体的东西。

使用typedef,如果您以后改变主意并决定使用std::vector而不是std::list,那么您的用户代码不需要更改(虽然它当然需要重新编译)。