好的,我猜这个信息可以通过深入了解实现内容得出,这就是我在最后一天所做的事情:)
我的问题是我想要一个我的template<class T>
(具有私有std::list<T>
成员)的方法来包装......但我无法弄清楚这个方法的返回值是什么。
我的代码如下:
template <class T >
class MyTemplate {
std::list<T> myList;
...
somereturnvaluehere myMethod(){
return myList.begin();
}
...
}
由于
答案 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>::iterator
或std::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
,那么您的用户代码不需要更改(虽然它当然需要重新编译)。