#include <iostream>
#include <vector>
#include <string>
using namespace std;

template<typename Iterator>
typename std::iterator_traits<Iterator>::value_type Sum(Iterator beg, Iterator end)
{
	typedef typename std::iterator_traits<Iterator>::value_type iter_traits_value;
	iter_traits_value sum = iter_traits_value();
	while(beg != end)
	{
		sum += *beg;
		++beg;
	}
	return sum;
}

int main() {
	int testArray[5] = {0,1,2,3,4};
	vector<double> v = {0, 1, 2, 3, 4};
	vector<string> s = {"hello", " ", "world"};
	
	cout << Sum(v.begin(), v.end()), cout << endl;
	cout << Sum(testArray, testArray + sizeof(testArray)/sizeof(testArray[0])), cout << endl;
	cout << Sum(s.begin(), s.end()), cout << endl;
	
	return 0;
}