[英]operator overloading and template specialization
我有一个模板类template<typename T, typename R>
。 R为vector<T*>
或list<T*>
。
我希望我的类重载[]
运算符,以便在它是向量的情况下,我将使用内置的[]
运算符来提高效率,并且在它是列表的情况下,我将使用迭代器实现它。
对我来说,这听起来像是模板专业化工作,所以我想写这样的东西:
template<typename T, typename R>
T& tContainer_t<T, R>::operator[]( unsigned i )
{
//TODO with iterators
}
template<>
T& tContainer_t::operator[]<T, std::vector<T*> >( unsigned i )
{
// TODO with built in [] operator
}
这是错误的,编译器不允许这样做。
有没有办法使它工作,还是应该在运行时使用typeid()
两个对象并采取相应的措施?
使用模板执行此操作的方法是在可以部分专门化的类中创建静态帮助器函数。 但是,我要做的是:
template<typename T, typename R>
T& tContainer_t<T, R>::operator[]( unsigned i )
{
//assuming that the container refernce is name container;
typename R::iterator itr = container.begin();
std::advance(itr, i);
return *itr;
}
std::advance
可以保证,对于具有随机访问迭代器(例如vector)的容器,它是恒定时间(基本上是iterator + n),它的速度可以与指针查找向量执行的速度一样快。 否则,它将执行iterator++
n次,这将是线性时间。 const版本将使用const_iterator,但本质上是相同的。
这样,您就可以正确处理不同类型的容器(而不仅仅是矢量和列表),而无需修改代码。
您不必使运算符超载。 aleady库包含重载的函数来帮助您。 std::advance
将移动迭代器,并利用operator+()
进行随机访问迭代器。
template<typename T, typename R>
T& tContainer_t<T, R>::operator[]( unsigned i )
{
typename R::iterator it = myContainer.begin();
std::advance(it, i);
return *it;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.