将std :: sort与自定义排序对象和数据类型模板一起使用 - 寻求正确的语法

时间:2013-11-19 09:56:26

标签: c++ templates sorting struct

我尝试使用自己的比较结构生成std :: sort但是我遇到模板类型的问题。

我有一个指向数据数组的std :: index索引,我想按数组的值对此列表进行排序。这适用于使用以下内容的已知数据类型数组:

struct SortByValue {
  double * src;
  SortByValue( double * srcP ){ src = srcP;}
  bool operator() (long i, long j) {return src[i]>src[j]; }
};

void MyClass::DoStuff(double * data){
  std::vector<ulong> myPointVec; 
  // [...] code filling myPointvec
  std::sort(myPointVec.begin(),myPointVec.end(),SortByValue(data));
};

但是,现在我的数据有不同的数据类型,我按照以下方式模拟了DoStuff方法:

template <typename T> void MyClass::DoStuff(typename T * data){
  std::vector<ulong> myPointVec; 
  // [...] code filling myPointvec
  std::sort(myPointVec.begin(),myPointVec.end(),SortByValue(data));
};

我遇到的问题是,我没有找到正确的语法将这个模板传递到我的SortByValue结构(需要保持指向正确类型的数据的指针。)我尝试(和失败)模板结构也是:

template <typename MT> 
struct SortByValue {
  MT * src;
  SortByValue( MT * srcP ){ src = srcP;}
  bool operator() (long i, long j) {return src[i]>src[j]; }
};

template <typename T> void MyClass::DoStuff(typename T * data){
  std::vector<ulong> myPointVec; 
  // [...] code filling myPointvec
  std::sort(myPointVec.begin(),myPointVec.end(),SortByValue((T *) data));
};

那么我该怎么做呢?有人可以发布代码示例吗?

1 个答案:

答案 0 :(得分:2)

您应该指出SortByValue的模板类型,并且typename T*是错误的构造,它无法编译。它应该是

template <typename MT> 
struct SortByValue {
  MT * src;
  SortByValue( MT * srcP ){ src = srcP;}
  bool operator() (long i, long j) {return src[i]>src[j]; }
};

template <typename T> void MyClass::DoStuff(T * data){
  std::vector<ulong> myPointVec; 
  // [...] code filling myPointvec
  std::sort(myPointVec.begin(),myPointVec.end(),SortByValue<T>(data));
};