[英]Return type of template method in C++
我有这两个header
文件, List.h
和ListTraits.h
List.h 继承自ListTraits.h
,它是一个模板 class 实现
的std::list
。 现在一切正常,但insert()
方法实现。 我有义务在List.h
中使用ListTraits.h
,而std::list insert
方法返回
一个iterator
, insert
的ListTraits.h
方法签名很奇怪。 这些是类:
列表.h
template <typename T>
class List: public ListTraits<T> {
protected:
std::list<T> list;
public:
unsigned int size() {return 0;}
ListTraits<T>& insert(const T& item) { //<----------I think I should be returning iterator, but I have to return something of ListTraits<T> and that doesnt make sense
typename std::list<T>::iterator it;
list.insert(list.end(), item);
return it;
}
const T* getCurrentElement() const {
}
...
和 ListTraits.h
#pragma once
//------------ Declarations for List traits used in Test1 in main.cpp
template <typename T> class ListTraits
{
public:
virtual unsigned int size() = 0;
virtual ListTraits& insert(const T& item) = 0; //<-----------------------INSERT METHOD HERE---#######
virtual void print() = 0;
};
//------------ Declarations for List traits used in Test2 in main.cpp
template <typename T> class ListTraitsExtended
{
public:
virtual const T* getCurrentElement() const = 0;
virtual void advance() = 0;
virtual void rewind() = 0;
};
您能否帮我完成insert
方法,使其成为标准库list.insert(it, value)
方法的模板版本?
改变
return it;
}
至
return *this;
}
这允许一种称为“方法链接”的技术。
list.insert(a).insert(b).insert(c);
有趣的是,如果您只需要在后面插入,我建议您更改std::list<T> list;
到std::vector<T> data;
然后通过data.push_back(item);
我上面所说的可能不是这种情况,咳咳,在你的情况下,因为你必须实现这样的方法:
T* getCurrentElement();
void advance();
void rewind();
这可能意味着您必须保留指向“当前”元素的指针,因此您可以在被询问时返回它,您还必须能够将 go 指向上一个元素或下一个元素,并可能在当前元素之后插入元素,而不是在末尾插入。
例如,如果我们忽略这个任务的整个想法是让您实现所谓的“双重链表”(意味着您必须保留 HeadPtr、TailPtr 和 CurrentPtr 并相应地移动它们)这一事实,您可以通过在后面返回最后插入的元素来实现getCurrentElement,并获取它的地址。 你不应该忘记检查是否有元素:
T* getCurrentElement()
{
T* result = nullptr;
if (!list.empty())
{
result = &list.back();
}
return result;
}
您应该真正检查在std::list和std::vector中哪些方法已经可用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.