运算符重载和模板专用化

operator overloading and template specialization

本文关键字:专用 重载 运算符      更新时间:2023-10-16

我有一个模板类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)的容器,它是常量时间(基本上,它执行迭代器 + 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;
}