【发布时间】:2018-01-29 00:40:16
【问题描述】:
研究
我找到了this old answer。我想知道该解决方案是否仍然有效,或者是否有更有效的新方法。
背景
假设我有一个像下面这样的迭代器(细节并不重要,只是它很大):
class inorder_iterator : public std::iterator<std::forward_iterator_tag, token>
{
friend syntax_tree;
node* current_node;
std::stack<node*> prev_nodes;
//std::stack<node*> visited_nodes;
std::map<node*, bool> visited;
public:
inorder_iterator();
inorder_iterator& operator++();
inorder_iterator operator++(int);
token& operator*();
const token& operator*() const;
token* operator->();
const token* operator->() const;
friend bool operator==(const inorder_iterator lhs, const inorder_iterator rhs);
friend bool operator!=(const inorder_iterator lhs, const inorder_iterator rhs);
private:
inorder_iterator(node* current);
node* find_leftmost_node(node* from);
};
问题
成员函数声明的实现大小合理,但我想重用当前的迭代器以减少代码重复。
想法
想到的第一个想法是模板化 node 类型,所以我可以通过 const node 使其成为 const 迭代器,但这听起来很可疑
template <typename Node>
//replace every occurrence of node with Node
// and use decltype(node.tk) instead of token everywhere
我也不确定const 的这种使用是否属于“const 属于实现细节”的情况之一。
【问题讨论】:
标签: c++ c++14 code-reuse const-iterator