繁体   English   中英

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方法返回

一个iteratorinsertListTraits.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::liststd::vector中哪些方法已经可用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM