Return C++ 中的模板方法类型

Return type of template method in C++

我有这两个 header 文件,List.hListTraits.h List.h 继承自 ListTraits.h,意为模板 class 实现

std::list。现在一切正常,但 insert() 方法实现。 我不得不在List.h中使用ListTraits.h,而std::list insert方法returns

an iteratorinsertListTraits.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