我正在尝试使用K
- >地图定义一个类pair
的{{1}}和V
list
的迭代器。这是为了实现LRU缓存。我使用了K
:
decltype
但是,我对使用template <typename K, typename V> class LRUCache {
std::list<K> q;
typedef decltype(q.begin()) Iterator;
typedef std::pair<V, Iterator> Node;
int max_size;
std::map<const K, Node> m;
}
不满意,当我尝试使用它时,它似乎都很脆弱。这样做的规范方法是什么?
答案 0 :(得分:1)
我完全不喜欢使用typedef
的老式方式,因为它似乎使用反向语法来声明内容。您还使用int i = 5
而非int 5 i
。 (不仅如此),引入了using
的新用法。
using Iterator = decltype(a.begin());
如果您不喜欢decltype
,可以使用std::list<K>::iterator
,但由于K
是模板参数,std::list<K>
是依赖名称,需要以typename
为前缀。
using Iterator = typename std::list<K>::iterator;
或者使用老式的typedef
typedef typename std::list<K>::iterator Iterator;
答案 1 :(得分:0)
迭代器的类型是
std::list<K>::iterator
如果你想使用它,你必须在它前面使用typename
,或者首先使用
using iterator = typename std::list<K>::iterator;
然而,使用decltype
似乎完全有效地使用它,如果你可以确定每个调用此代码的人都有c ++ 11或更高版本。
答案 2 :(得分:0)
要添加其他人的答案 - std::list<K>::iterator
是依赖类型,C ++要求我们在其前面使用typename
。
原因是编译器不知道::iterator
是否是一个类型,因此需要提示typename
。
处理原始问题的另一种方法是使用using
模板,类似于在C ++ 14中定义某些<type_traits>
的方式。我们可以定义:
template <typename T> using ListIterator = typename std::list<T>::iterator;
现在,我们可以在LRUCache代码中使用ListIterator<K>
:
template <typename K, typename V> class LRUCache {
using Node = std::pair<V, ListIterator<K>>;
std::list<K> q;
std::map<const K, Node> m;
int max_size;
}