#include <iostream>
#include <chrono>
#include <ratio>
#include <vector>
#include <numeric>

template <class Rep, class Period = std::ratio<1> >
using tmp_t = std::chrono::duration<Rep, Period>;

typedef tmp_t<int64_t> dollar_t;
typedef tmp_t<int64_t, std::ratio<1,100>> cent_t;

typedef tmp_t<int64_t, std::ratio<1,100>> store_money_t;
typedef tmp_t<double> show_money_t;
dollar_t dollar_lost_cents_cast(cent_t cents) { return std::chrono::duration_cast<dollar_t>(cents); }
std::ostream& operator<<(std::ostream& os, show_money_t show_money) { os << "$" << show_money.count(); return os; }
std::ostream& operator<<(std::ostream& os, store_money_t store_money) { os << store_money.count(); return os; }

int main() {

	// example
	store_money_t store_money = dollar_t(2) + cent_t(20);
	store_money += dollar_t(7);
	store_money += cent_t(18);
	
	cent_t cents = store_money;
	dollar_t dollars = dollar_lost_cents_cast(cents);
	show_money_t show_money = cents;
	
	std::cout << "dollar_lost_cents_cast = " << dollar_lost_cents_cast(store_money).count() << 
		", store_money = " << store_money << 		
		", show_money = " << show_money << 
		std::endl;

	std::vector<store_money_t> user_accounts(1000, store_money);
	store_money_t total = std::accumulate (user_accounts.begin(), user_accounts.end(), store_money_t(0));
	std::cout << "total = " << show_money_t(total);

	return 0;
}