为了获得一个“更容易记住”的界面 索引生成函数std :: distance(a,b),我出现了 想要更好地区分它的论点 (当用于向量的基础时:vec.begin()) 通过向量调用模板化函数 和它的迭代器,如:
std::vector<MyType> vect;
std::vector<MyType>::const_iterator iter;
...
...
size_t id = vectorindex_of(iter, vect);
的理由是永远不要混淆顺序 参数; - )
上述观点的明确表述会 看了......像
template <typename T>
inline
size_t vectorindex_of(
typename std::vector<T>::const_iterator iter,
const std::vector<T>& vect ) {
return std::distance( vect.begin(), iter );
}
......虽然有效,但看起来很尴尬。
我希望让模板机制隐式推断出类型 喜欢(伪代码):
template <typename T>
inline
size_t vectorindex_of(T::const_iterator iter, const T& vect) {
return std::distance( vect.begin(), iter );
}
......这不起作用。但为什么呢?
答案 0 :(得分:8)
修复很简单:在typename
之前添加T::const_iterator iter
。这是必需的,因为类模板可能是专用的,并且使用typename
告诉编译器类型名称应该在T::const_iterator
而不是值或什么。
您也可以在不太通用的功能中执行相同操作。
答案 1 :(得分:2)
template <typename T>
inline
std::size_t vectorindex_of(typename T::const_iterator iter, const T& vect) {
return std::distance( vect.begin(), iter );
}
应该正常工作(注意typename
)。在任何一种情况下都应该推导出模板参数。
答案 2 :(得分:1)
您可能也对获取矢量迭代器索引的“更容易记住”的方式感兴趣:
i - vec.begin()
它与使用随机访问迭代器的指针算法相同!