将迭代器传递给模板

时间:2016-03-05 20:37:59

标签: c++ templates iterator

对于不明确的问题,我们深表歉意。我需要使用以下模板使用插入算法对属于自定义类的对象数组进行排序:

template<typename pointer, typename T, typename Functype>
void sort_array(pointer puntatore, T* obj, int dim, Functype pred){
    T val;
    for(int i=1; i<dim; i++){
        val=obj[i];
        for(int j=(i-1); j>=0; j--){
            if(pred(obj[j].*puntatore, val.*puntatore)){
                obj[j+1]=obj[j];
                obj[j]=val;
            }
        }
    }
}

我想知道如何编写一个更通用的模板,它可以接受任何类型的迭代器,它指向类T的对象,而不仅仅是指针。在参数列表中编写T obj会让我在赋值中遇到变量T val的问题,在这种情况下,*val=obj[i]就像val本身就是迭代器。有没有办法告诉模板他必须采用指向类T的对象的泛型迭代器(即以同样的方式编写T*告诉它期望指向类的对象的指针{ {1}})?

我如何使用此模板的示例

T

1 个答案:

答案 0 :(得分:2)

您可以从STL实现中获取灵感,并提供一个接口,该接口将采用范围而不是如下所示的数组:

template<typename BidirectionalIterator, typename Predicate = 
  std::less<typename std::iterator_traits<BidirectionalIterator>::value_type>>
void
insertion_sort(BidirectionalIterator first, BidirectionalIterator last, 
  Predicate pred = {}) {
  if(first != last) {
    auto it = first; 
    while(++it != last) {
      auto it2 = it;
      while(it2 != first) {
        auto it3 = it2;
        --it3;
        if(pred(*it2, *it3)) {
          std::swap(*it2, *it3);
        } else {
          break;
        }
        --it2;
      }
    }
  }
}

Live Demo

请注意,您还可以为对象提供重载的operator<operator>,以便使用标准谓词:

bool
operator<(T const &A, T const &B) {
  return A.*puntatore < B.*puntatore;
}


bool
operator>(T const &A, T const &B) {
  return A.*puntatore < B.*puntatore;
}