运算符重载和模板专用化
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)的容器,它是常量时间(基本上,它执行迭代器 + 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;
}
相关文章:
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 模板专用化与函数重载
- C++函数模板专用化和重载
- 函数模板重载 - 部分专用化
- 专用和/或重载具有可变参数的成员函数模板
- 模板专用类之间的构造函数重载
- 通过重载实现部分模板专用化
- 如何为模板类的所有实例专用化或重载全局模板函数
- 对于重载函数,为父实例和子实例调用专用版本
- 部分专用结构与重载函数模板
- 部分模板专用化可能不适用于函数,但重载不是一回事吗?
- 运算符<<重载时无法访问专用成员(指定指针)
- 为什么重载优先于ADL中的显式专用化
- 重载特定模板专用化的成员函数
- 运算符重载和模板专用化
- 以下语句是函数重载还是函数部分专用化
- 函数模板重载 - 专用化
- 带有重载的显式模板函数专用化:为什么要这样做
- 重载运算符'<<'(左移)的显式专用化
- 在模板专用化和重载 C++ 方面没有预期的歧义