
Daniel Frey <d.frey <at> gmx.de> writes:
I strongly suggest to use a currency, as otherwise you'll likely miss the intended audience's requirements.
I actually had this implemented at start but removed it at one point. I implemented it like this: template <class DecimalT, int CurrencyId = 0> class money_base ... You created different currencies by doing typedef money_base<decimal64, 1> USD; typedef money_base<decimal64, 2> EUR; If I needed values without currency I just used the decimal type. decimal exchangerate(usd.as_decimal(5) / eur.as_decimal(), 5); // 5 decimals (Your debtor example would probably need to use boost.any with my solution) Your run-time currency type is an interesting approach.
Integers works as both money and decimal so Money*2 and Money+1 is always allowed.
money*int is OK, money+int is not. And FWIW, I never saw any of my colleagues complain about money+int not compiling. If the compiler happens to catch it, it usually means that it saved them from a having bug!
And I was afraid my interface was to strict. Thanks.
The application can/should then create central typedefs:
typedef basic_decimal<long double> decimal; typedef basic_money<decimal::value_type> money;
Not sure I understand. The implementation of decimal arithmetic will be very different depending on the type (e.g. double, int, BCD strings) so I don't see how it can all fit into a basic_decimal. It is fine as an ABC but does it really add anything (except virtual calls). Also shouldn't basic_money use the decimal type instead of the decimal type's internal representation (i.e. basic_money<decimal>)
That way, you can switch your complete application for different underlying types that are used for the real calculations easily.
You can do the same with my solution but it would look like this: typedef money_base<decimal64> money; or typedef money_base<decimalBCD> money; typedef money::decimal_type decimal;