std::iterator 的用法。正在将 std::d eque<T>::{const_iterator|iterator} 转换为 std::iterator<Args...>

Usage of std::iterator. Converting std::deque<T>::{const_iterator|iterator} to std::iterator<Args...>

提问人:b442 提问时间:10/24/2022 最后编辑:Nicol Bolasb442 更新时间:10/24/2022 访问量:68

问:

我有接口并实现它。我想允许用户遍历任何具体文档,所以我尝试在界面中添加和成员。IDocumentConcreteDocumentbegin()end()

IDocument:

virtual R begin() const noexept = 0;

R必须是具体的,由模板接口参数或方法的模板参数给出(虚拟方法不可能)。T

应该是什么?R

我尝试使用模板作为界面,但这是一个坏主意,bc 客户端现在知道正在使用什么。ContainerTConcreteDocument

我尝试使用 ,但我的例如使用 ,所以 和 之间的转换是未定义的std::iteratorConcreteDocumentstd::deque<T>std::iteratorstd::deque<T>::{const_iterator|iterator}

有什么想法吗?

更新:

好的,std::iterator 已弃用

代码示例:

class IDocument
{
public:
    using Path = StdPath;

    virtual void InsertItem(const ItemT&
        std::optional<size_t> position = std::nullopt)
        = 0;

    virtual size_t GetItemsCount() const = 0;

    virtual const DocumentItem& GetItem(size_t index) const noexcept = 0;

    virtual void DeleteItem(size_t index) = 0;

    virtual const std::string& GetTitle() const = 0;
    virtual void SetTitle(const std::string& title) = 0;

    // `begin()` `end()` methods, but how signature looks like if i don't know what concrete container is used by derived classes?

    virtual ~IDocument() = default;
};

class HTMLDocument : public IDocument
{
public:
    HTMLDocument() = default;

    template <typename StringT = std::string>
    HTMLDocument(StringT&& string)
        : m_title(std::forward<StringT>(string))
        , m_undoManager()
    {
    }


    size_t GetItemsCount() const final;

    const DocumentItem& GetItem(size_t index) const noexcept final;

    void DeleteItem(size_t index) final;

    const std::string& GetTitle() const final;
    void SetTitle(const std::string& title) final;

    void Save(const StdPath& path) const final;

    // here need `begin()` and `end()` methods accessable through IDocument*

private:
    std::string m_title = "Title";
    std::deque<DocumentItem> m_items;

    UndoManager m_undoManager{};
};

我需要实现将文档内容输出到的非成员函数std::ostream&

因此,对于更方便的用法,我想要界面和方法,但我无法弄清楚它们的签名是什么,因为它们是基于的begin()end()ContainerT

C++ 迭代器 容器 std

评论

0赞 HolyBlackCat 10/24/2022
std::iterator是一个已弃用的类,里面只有一堆 typedef,你不应该需要它。什么是“模板接口参数”?你能展示更多代码吗?
0赞 b442 10/24/2022
这里有一些更新,@HolyBlackCat
0赞 273K 10/24/2022
和 有什么问题?return m_items.begin()return m_items.end()
0赞 b442 10/24/2022
@273K,问题不在于此,而在于不清楚 begin() 和 end() 方法在接口中应该有什么签名,因为虚拟 decltype(auto) begin() 不起作用
0赞 273K 10/24/2022
您似乎必须实现自己的迭代器类来支持所需的迭代器特征。

答: 暂无答案