Я хочу объявить и реализовать функцию, которая принимает в качестве параметров либо указатель, либо итераторы. То есть сказать что-то вроде
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
.
Я уверен, что вы не можете реализовать функцию, которая принимает либо указатели, либо итераторы без использования шаблонов. Хотя указатели и итераторы по существу реализуют одну и ту же концепцию, они не являются типами, где один деградирует в другой, такой как массив 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 << " ";
}
Вы можете вручную настроить шаблон функции, который вам нужно будет сделать, чтобы реализовать реализацию функции в отдельном исходном файле, однако моя рекомендация заключалась бы в том, чтобы вся функция была включена в заголовочный файл и позволила компилятору справиться с этим. Современные компиляторы и компоновщики неплохо справляются с этим сценарием и избегают возможного дублирования кода.
Просто используйте функцию шаблона, не нужно иметь реализацию в отдельном cpp
template <class Itr>
void run_through(Itr&& begin, Itr&& end)
{
for (Itr it = begin; it != end; ++it)
std::cout << *it << " ";
}