Инициализировать шаблонный тип как "ноль" - PullRequest
1 голос
/ 26 августа 2011

Если у меня есть шаблонная функция, скажем, такая, которая вычисляет среднее значение путем суммирования элементов в контейнере типа T, содержащем вещи типа T :: value_type, как мне элегантно инициализировать сумму с нулем?

Предположим, что базовый тип не является простым старым типом данных. Это может быть комплексная переменная или какая-то другая, еще не закодированная математическая сущность, которая имеет форму нуля.

Нечто более элегантное, чем

T::value_type sum = 0;

Тогда надеемся на лучший актерский состав.

Ответы [ 4 ]

3 голосов
/ 26 августа 2011

может быть, вы хотели бы лучше

T::value_type sum = T::value_type();
2 голосов
/ 26 августа 2011

Примите начальное значение в качестве параметра:

template<typename In, typename T>
T accumulate(In first, In last, T init);

Кстати, это сигнатура std::accumulate() из <numeric>.

2 голосов
/ 26 августа 2011
typename T::value_type sum = typename T::value_type(); //or simply = 0;

Важным моментом здесь является: typename является обязательным. Если вы не напишите, компилятор, соответствующий стандартам, выдаст ошибку компиляции.

0 голосов
/ 26 августа 2011

Вы можете либо попросить пользователя предоставить начальное «пустое» значение, либо вы можете взять первый элемент в качестве начального значения, а затем выполнить сложение из второго элемента. Это приводит к использованию только конструктора по умолчанию, если вы передаете ему пустой список. В противном случае он использует первый элемент в качестве начальной суммы и идет оттуда.

template <class Iterator>
typename std::iterator_traits<Iterator>::value_type average_elements(Iterator first, Iterator last) {
   typedef typename std::iterator_traits<Iterator>::value_type value_type;
   if (first == last) {
      return value_type(); // Best you can do
   }  
   value_type sum = *first++;
   size_t n = 1;
   while (first != last) {
       sum += *first++;
       ++n;
   }
   return sum / n;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...