2016-03-09 3 views
-1

Я пытаюсь написать универсальную функцию, которая принимает инициализатор-список в качестве аргумента, добавляет элементы и возвращает это число. Если список пуст, он должен возвращать 0. Код выглядит корректно для меня, но всякий раз, когда я его запускаю, он возвращает 4 199 991 вместо 10 из ввода {1, 2, 3, 4} I. Я изменил функцию, чтобы распечатать элементы, а не добавлять их, и это отлично работает, оно выводит 1234, поэтому я понятия не имею, в чем проблема. Любая помощь приветствуется.Добавить элементы списка инициализаторов

#include <iostream> 
#include <initializer_list> 

template <typename T> 
//add elements of initializer list 
T total(initializer_list<T> & elements) 
{ 
    T tmp; 
    if(elements.size() != 0) 
    { 
     for(auto itr = elements.begin(); itr != elements.end(); ++itr) 
     { 
      tmp += *itr; 
      return tmp; 
     } 
    }else 
     return 0; 
} 

int main() 
{ 
    initializer_list<int> num({1, 2, 3, 4}); 
    cout << total(num); 

    return 0; 
} 
+2

'tmp' не инициализирован и' вернуть TMP; 'неуместна. –

+0

Ого, это имеет большой смысл. Спасибо. Я понятия не имею, почему у меня было возвращение в цикл for. – Tango

ответ

2

Вы можете рассмотреть зЬй :: накапливают:

#include <algorithm> 
#include <iostream> 
#include <initializer_list> 

template <typename T> 
//add elements of initializer list 
T total(std::initializer_list<T> & elements) 
{ 
    // Note: Using 0 will decay the result to an integer, hence the T{} for zero. 
    return std::accumulate(elements.begin(), elements.end(), T{}); 

    // Fixing the original code (where tmp is uninitialized 
    // and the return tmp; is misplaced): 
    // T tmp = 0; 
    // for(auto itr = elements.begin(); itr != elements.end(); ++itr) 
    // tmp += *itr; 
    // return tmp; 
} 

int main() 
{ 
    std::initializer_list<int> num({1, 2, 3, 4}); 
    std::cout << total(num) << '\n'; 
} 
+0

Это очень упрощает все, спасибо. – Tango