提问人:b442 提问时间:10/24/2022 最后编辑:Nicol Bolasb442 更新时间:10/24/2022 访问量:68
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...>
问:
我有接口并实现它。我想允许用户遍历任何具体文档,所以我尝试在界面中添加和成员。IDocument
ConcreteDocument
begin()
end()
IDocument
:
virtual R begin() const noexept = 0;
R
必须是具体的,由模板接口参数或方法的模板参数给出(虚拟方法不可能)。T
应该是什么?R
我尝试使用模板作为界面,但这是一个坏主意,bc 客户端现在知道正在使用什么。ContainerT
ConcreteDocument
我尝试使用 ,但我的例如使用 ,所以 和 之间的转换是未定义的std::iterator
ConcreteDocument
std::deque<T>
std::iterator
std::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
答: 暂无答案
下一个:地图的迭代器类型是什么?
评论
std::iterator
是一个已弃用的类,里面只有一堆 typedef,你不应该需要它。什么是“模板接口参数”?你能展示更多代码吗?return m_items.begin()
return m_items.end()