Return C++ 中的模板方法类型
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
方法returns
an iterator
,insert
的 ListTraits.h
方法签名很奇怪。这些是 classes:
List.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();
这可能意味着您必须保留指向“当前”元素的指针,以便在被询问时可以 return 它,您还必须能够转到上一个元素或下一个元素元素,并可能在当前元素之后插入,而不是在末尾插入。
例如,如果我们忽略这个事实,即这个赋值的整个想法是让你实现所谓的“双链表”(意味着你必须保留 HeadPtr、TailPtr 和 CurrentPtr 并移动它们相应地),您可以通过 returning 后面最后插入的元素并获取其地址来实现 getCurrentElement 。你不应该忘记也检查是否有元素:
T* getCurrentElement()
{
T* result = nullptr;
if (!list.empty())
{
result = &list.back();
}
return result;
}
你真的应该检查里面有哪些方法已经开箱即用 std::list and std::vector
我有这两个 header
文件,List.h
和 ListTraits.h
List.h 继承自 ListTraits.h
,意为模板 class 实现
个 std::list
。现在一切正常,但 insert()
方法实现。
我不得不在List.h
中使用ListTraits.h
,而std::list insert
方法returns
an iterator
,insert
的 ListTraits.h
方法签名很奇怪。这些是 classes:
List.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();
这可能意味着您必须保留指向“当前”元素的指针,以便在被询问时可以 return 它,您还必须能够转到上一个元素或下一个元素元素,并可能在当前元素之后插入,而不是在末尾插入。
例如,如果我们忽略这个事实,即这个赋值的整个想法是让你实现所谓的“双链表”(意味着你必须保留 HeadPtr、TailPtr 和 CurrentPtr 并移动它们相应地),您可以通过 returning 后面最后插入的元素并获取其地址来实现 getCurrentElement 。你不应该忘记也检查是否有元素:
T* getCurrentElement()
{
T* result = nullptr;
if (!list.empty())
{
result = &list.back();
}
return result;
}
你真的应该检查里面有哪些方法已经开箱即用 std::list and std::vector