模板类中函数的部分专用化
partial specialization of function in template class
我有一个表示数值数组的模板类。
我希望这个类适用于任何类型的数值(例如 int、double 等)和三种类型的容器(std::vector、std::d eque 和 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 的运算符 [] 的一种部分专用化,但 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;
经过大量研究,我无法找到可行的解决方案。
解决这个问题最优雅的方法是什么?
感谢您的帮助。
一个干净的解决方案是使用全类模板专用化。不同的专用化可以从一个公共基类派生出来,以便共享公共代码。
编写一个类ArrayBase
,其中包含不依赖于特定容器类型的所有代码,并通过保护容器或Array
成为友元类来授予对容器的访问权限。
template <class Numeric_t, class Container>
class Array
: public ArrayBase<Numeric_t, Container>
{
// Container specific code, generic version that works for all containers.
};
template <class Numeric_t>
class Array<Numeric_t, std::vector<Numeric_t>>
: public ArrayBase<Numeric_t, std::vector<Numeric_t>>
{
// Optimized code for std::vector.
}
另一种方法:还可以编写一个静态成员函数,其中包含访问容器的第 idx
个条目的代码,并使该函数专用化:
template <class Numeric_t, class Container>
class Array
{
template <class Cont>
static Numeric_t get(Cont const& container, unsigned int idx)
{
std::list<Numeric_t>::iterator it = container.begin();
std::advance(it, idx);
return *it;
}
template <>
static Numeric_t get(std::vector<Numeric_t> const& container, unsigned int idx)
{
return container[idx];
}
public:
Numeric_t operator[](unsigned int idx) const { return get(m_data, idx); }
};
对不起,这行不通。我忘了你不能专门化静态成员函数......再。
另一种选择是使用 SFINAE,但它是它的非惯用法,在这种情况下我不推荐它。
相关文章:
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 具有常量引用参数的函数模板专用化
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- C++模板专用化 - 无法匹配函数定义
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 如何使专用函数模板成为某个类的朋友?
- 如何按类型为元组元素创建专用函数
- 无法访问专用函数
- 使用指向部分专用函数成员的指针自动填充向量
- 64 位 G++ 4.6.3 不会在专用函数模板中将长整型视为长整型,即使它们的大小相同。这是一个错误吗?
- 操作员过载的专用函数
- C++调用模板专用函数
- 模板类中专用函数的声明
- 使用专用函数对异构集合的 STL 算法
- C++专用函数-不在此范围内错误
- 为什么我不能专用函数模板?
- 用于专用函数参数的模板
- 代码重复和模板专用化(当专用函数具有不同的返回类型时)
- 具有专用函数的Pull-Apart函数类型
- 专用函数模板