0

我有一个模板类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()在运行时区分这两个对象并采取相应的行动?

4

2 回答 2

3

使用模板的方法是在一个可以部分特化的类中创建一个静态辅助函数。但是,我会做的是:

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保证对于具有随机访问迭代器(例如向量)的容器,它是恒定时间(基本上,它是迭代器 + n),它可以与指针查找向量执行的速度一样快。否则,它会执行iterator++n 次,这将是线性时间。const 版本将使用 const_iterator,但本质上是相同的。

这样做可以让您正确处理不同类型的容器(不仅仅是向量和列表),而无需修改代码。

于 2012-05-23T11:48:27.220 回答
2

您不必重载运算符。库 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;
} 
于 2012-05-23T11:48:51.643 回答