【问题标题】:Template class member function specialization?模板类成员函数特化?
【发布时间】:2012-04-03 06:16:23
【问题描述】:

我就这个主题提出了很多问题,但仍然找不到我可以使用的答案。

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

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;
};

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

向量应该按传递的多边形对象的面积排序,或者当然,按传递的整数的值。

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

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

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

【问题讨论】:

  • 你的sortedVector不应该也存储一个比较函子吗?
  • 你的意思是==?可能,我对此完全陌生,但如果需要,我稍后会添加它。我需要它做什么? :)

标签: c++ templates member specialization


【解决方案1】:

在 C++ 中,维护排序的容器通常具有用于比较函子的模板参数,用于确定元素的排序。以std::set 为例:

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

你可以跳过这个练习的分配器。默认的Compare 仿函数将使用operator&lt;,但如果我想使用不同的东西,我可以像这样实例化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;
}

【讨论】:

  • 不幸的是,这是我从未听说过的事情,鉴于任务的性质和限制,我认为在这种情况下不应该使用。老实说,我可能在考虑专业化方面走错了路。
  • 作业如下:“在这个作业中,您将创建一个模板类 SortedVector,它应该能够存储任何给定类的实例或内置的 C++ 数据类型。方法 add()如果向量已满,则应返回“false”。当然,还有一个类至少应具有的列表和给定的“main”。
  • 所以,这正是您所需要的。我添加了一个默认实现。虽然我认为你需要自己维护存储而不是依赖std::vector。如果您不想依赖任何 stdlib 功能,也可以跳过默认的 Compare 并自行实现 sort
  • 你知道那种感觉吗?当你突然意识到你是多么的愚蠢? :D 当然!我的班级必须有一个比较运算符。 掌心
  • @JKase 你知道当你的答案需要付出努力时,你既没有被赞成也没有被接受的感觉,涉及解开别人的要求并且是 100% 准确的;)
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
相关资源
最近更新 更多