0

我想这些信息可以通过深入了解<list>实现来获得,这就是我在最后一天所做的。

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

我的代码如下所示:

template &lt;class T &gt;
    class MyTemplate {
       std::list&lt;T&gt; myList;
       ...

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

}
4

5 回答 5

8

它是

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

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

在 C++11 中,你不需要担心它,如果你愿意,你可以使用 trailing-return 类型为:

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

但是我认为,就您的情况而言,这太过分了,实际上,这会使事情变得不必要地复杂化。所以我建议你不要使用它;但只要知道在 C++11 中有一种叫做trailing-return-type的东西,在某些情况下使用它可能是合理的。

于 2012-05-22T14:24:30.407 回答
7

该列表begin将返回一个std::list<T>::iterator.

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

typename std::list<T>::iterator
于 2012-05-22T14:22:41.833 回答
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;
};
于 2012-05-22T14:23:46.863 回答
1

std::list<T>::begin()正如其他人所说,将返回 astd::list<T>::iterator或 a 。std::list<T>::const_iterator

可能更重要的是要从该myMethod()功能中获得什么?

如果您只是在 a 周围编写一个薄包装器,std::list那么我不确定我是否看到了价值。理想情况下,您会将列表封装在您的类中,这样它的实现就不会暴露。

于 2012-05-22T14:30:31.227 回答
1

正如其他人所说,它将是std::list<T>::iterator。但是为了提供更简洁的 API,并允许自己在将来更改它有一定的灵活性,您可能需要定义自己的 typedef(映射到std::list<T>::iterator)并将其用作返回类型。IE:

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

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

}

在这里,我将 typedef 命名为 just iterator,这意味着您的类的用户会将其称为MyTemplate<T>::iterator-- 但根据myMethod()您的类的功能和详细信息,您可能希望将其命名为更具体的名称。

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

于 2012-05-22T14:42:21.037 回答