Отвечая на этот вопрос на CodeReview, я думал о том, как можно написать функцию шаблона, чтобы указать const
-ness содержащегося объекта.
Чтобы быть конкретным, рассмотрим эту шаблонную функцию
#include <iostream>
#include <numeric>
#include <vector>
template <class It>
typename std::iterator_traits<It>::value_type average(It begin, It end) {
typedef typename std::iterator_traits<It>::value_type real;
real sum = real();
unsigned count = 0;
for ( ; begin != end; ++begin, ++count)
sum += *begin;
return sum/count;
}
int main()
{
std::vector<double> v(1000);
std::iota(v.begin(), v.end(), 42);
double avg = average(v.cbegin(), v.cend());
std::cout << "avg = " << avg << '\n';
}
Он принимает итератор и вычисляет среднее значение на основе содержащихся чисел, но гарантированно не изменять вектор через прошедшие итераторы. Как передать это пользователю шаблона?
Обратите внимание, что объявление этого типа:
template <class It>
typename std::iterator_traits<It>::value_type average(const It begin,
const It end)
не работает, потому что это не итератор, а то, на что указывает итератор, что const
. Должен ли я ждать, пока стандарты будут стандартизированы?
Обратите внимание, что я не хочу требовать константных итераторов, но вместо этого укажу, что они могут быть безопасно использованы здесь. То есть, вместо того, чтобы ограничивать вызывающего абонента, я хочу передать обещание, которое делает мой код: "Я не буду изменять ваши базовые данные".