【发布时间】:2012-04-18 06:37:06
【问题描述】:
我有一个表示数值数组的模板类。
我希望这个类适用于任何类型的数值(例如 int、double 等)和三种类型的容器(std::vector、std::deque 和 std::list)。
以下是针对我的具体问题的相关实现部分:
template < typename Numeric_t, typename Container = std::vector<Numeric_t> >
class Array {
// field member
Container m_data;
// other stuff here
// ...
// random element access for std::vector and std::deque
Numeric_t & operator[] (unsigned int index) { return m_data[index]; }
// random element access for std::list
Numeric_t & operator [] (unsigned int index) {
std::list<Numeric_t> :: iterator it = m_data.begin();
std::advance(it, index);
return *it;
}
}
当然,编译器不允许我重载运算符[]。
我需要的是一种特定于 std::list 的 operator [] 的部分特化,但在 C++ 中也不允许部分模板函数特化。
(我知道随机元素访问对于列表来说效率不高,但这不是重点)。
理想情况下,在客户端代码中,我想像这样使用 Array 类:
Array < int, std::vector<int> > vec;
Array < int, std::list<int> > lst;
// fill arrays here
// ...
std::cout << vec[0] << std::endl;
std::cout << lst[0] << std::endl;
经过大量研究,我无法找到可行的解决方案。
解决这个问题最优雅的方法是什么?
感谢您的帮助。
【问题讨论】:
-
我认为您的意思是“覆盖”,而不是“重载”...但我认为您需要对整个
Array类进行专门化,以应对Container是list的情况。 -
您是否尝试为整个班级编写专业化?如果您有不特定于模板类型的代码,您可以编写模板基类并使您的专用类从该基类继承。
-
我们已经有一个常见问题解答问题
-
@JohannesSchaub-litb 感谢您的链接。非常适合我的问题。
标签: c++ templates operator-overloading specialization