模板类成员函数专业化?

时间:2012-03-18 13:29:18

标签: c++ templates member specialization

我经历了很多关于这个问题的问题,但仍未找到我可以使用的答案。

我有一个模板类,声明如下:

template <typename Type, int inSize>
class sortedVector
{
    public:
         sortedVector();
         int getSize();
         int getAmountElements();
         bool add(const Type &element);

    private:
        Type *vector;
        int size;
        int amountElements;
};

该类应该表示可以存储任何类型元素的有序向量。这是编程课程作业的一部分。到目前为止,似乎赋值中给出的main函数将整数和Polygon类型的对象传递给函数。 Polygon是我之前完成的课程。

矢量应该按照传递的多边形对象的区域进行排序,当然也可以按传递的int的值进行排序。

为此,我想我需要两种不同的add实现(const Type&amp; element)。一个负责将int放入向量的正确位置,另一个负责获取多边形的区域并将其插入向量中的正确位置。

我们谈论AFAIK关于模板的专业化。

我尝试了几种不同的方法,但到目前为止只是遇到了编译器错误。什么是实现这一目标的最佳方式?

1 个答案:

答案 0 :(得分:2)

在C ++中,维护排序的容器通常会有一个用于比较仿函数的模板参数,用于确定元素的排序。例如,请查看std::set

template<typename Key, typename Compare = std::less<Key>, class Allocator = allocator<Key>>
class set;

您可以跳过此练习的分配器。默认的Compare仿函数将使用operator<,但如果我想使用不同的东西,我可以像这样实例化set

typedef std::set<int, std::greater<int> > MySet;

因此,您无需在此处使用专业化。你怎么能 无论如何?你不可能专注于你的所有课程 排序的矢量可以使用,因为你永远不知道有多少 他们在那里。

所以这会使sortedVector的声明看起来像这样:

template<typename Elem, 
         typename Compare = std::less<Elem> >
class sortedVector {
public:
  // take the functor as a constructor argument in case it cannot be
  // default constructed
  sortedVector(Compare c = Compare()) : cmp_(c) {}

  // ...snip...
  void push_back(const Elem& x) {
    cont_.push_back(x);
    std::sort(begin(cont_), end(cont_), cmp_);
  }

private:
  // trick just use a std::vector as storage and guarantee our sorted invariant
  std::vector<Elem> cont_;

  // we need to store the comparison functor in case it has state
  Compare cmp_;
};

#include<iostream>
int main(){
   long long num;
   std::cin>>num;
   std::cout<<num;
}