Обмен сырых указателей и итераторов

0

Я хочу объявить и реализовать функцию, которая принимает в качестве параметров либо указатель, либо итераторы. То есть сказать что-то вроде

void run_through(const Itr& begin, const Itr& end)
{
  for (Itr it = begin; it != end; ++it)
    std::cout << *it << " ";
}

И я хочу, чтобы это вызывалось с помощью либо итератора, либо указателя. То есть сказать что-то вроде.

int main(int, char**)
{
  int a[] = {3, 1, 4, 1, 5, 9};
  std::vector<int> A(a, a+6);
  std::set<int> B(a, a+6);

  run_through(a, a+6);
  run_through(A.begin(), A.end());
  run_through(B.begin(), B.end());

  return 0;
}

Мне интересно, могу ли я объявить run_through без каких-либо параметров шаблона и реализовать реализацию run_through в отдельном файле .cpp.

  • 0
    Одной из гениальных особенностей C ++ является то, что из-за перегрузки операторов указатели могут использоваться в качестве итераторов произвольного доступа. Все, что вам нужно сделать, это сделать вашу функцию шаблоном.
Теги:
templates

2 ответа

1

Я уверен, что вы не можете реализовать функцию, которая принимает либо указатели, либо итераторы без использования шаблонов. Хотя указатели и итераторы по существу реализуют одну и ту же концепцию, они не являются типами, где один деградирует в другой, такой как массив C, к деградации указателя.

Таким образом, чистое решение действительно использует одну функцию шаблона, например, в С++ 98:

template<typename forward_itr>
void run_through(forward_itr begin, forward_itr end)
{
  for (forward_itr it = begin; it != end; ++it)
    std::cout << *it << " ";
}

Вы можете вручную настроить шаблон функции, который вам нужно будет сделать, чтобы реализовать реализацию функции в отдельном исходном файле, однако моя рекомендация заключалась бы в том, чтобы вся функция была включена в заголовочный файл и позволила компилятору справиться с этим. Современные компиляторы и компоновщики неплохо справляются с этим сценарием и избегают возможного дублирования кода.

0

Просто используйте функцию шаблона, не нужно иметь реализацию в отдельном cpp

template <class Itr>
void run_through(Itr&& begin, Itr&& end)
{
  for (Itr it = begin; it != end; ++it)
    std::cout << *it << " ";
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню