#include template class if_; template struct if_ { typedef TrueResult result; }; template struct if_ { typedef FalseResult result; }; template struct coinConverter{ enum { Cent25 = coinConverter::Cent25, Cent10 = coinConverter::Cent10, Cent5 = coinConverter::Cent5, Cent1 = coinConverter::Cent1, }; }; template struct coinConverter<0, cents, cent25, cent10, cent5, cent1> { enum { Cent25 = if_<(cents >= 25), coinConverter<0, cents - 25, cent25 + 1, cent10, cent5, cent1>, if_<(cents >= 10), coinConverter<0, cents - 10, cent25, cent10 + 1, cent5, cent1>, if_<(cents >= 5), coinConverter<0, cents - 5, cent25, cent10, cent5 + 1, cent1>, coinConverter<0, cents - 1, cent25, cent10, cent5, cent1 + 1>>::result>::result>::result::Cent25, Cent10 = if_<(cents >= 25), coinConverter<0, cents - 25, cent25 + 1, cent10, cent5, cent1>, if_<(cents >= 10), coinConverter<0, cents - 10, cent25, cent10 + 1, cent5, cent1>, if_<(cents >= 5), coinConverter<0, cents - 5, cent25, cent10, cent5 + 1, cent1>, coinConverter<0, cents - 1, cent25, cent10, cent5, cent1 + 1>>::result>::result>::result::Cent10, Cent5 = if_<(cents >= 25), coinConverter<0, cents - 25, cent25 + 1, cent10, cent5, cent1>, if_<(cents >= 10), coinConverter<0, cents - 10, cent25, cent10 + 1, cent5, cent1>, if_<(cents >= 5), coinConverter<0, cents - 5, cent25, cent10, cent5 + 1, cent1>, coinConverter<0, cents - 1, cent25, cent10, cent5, cent1 + 1>>::result>::result>::result::Cent5, Cent1 = if_<(cents >= 25), coinConverter<0, cents - 25, cent25 + 1, cent10, cent5, cent1>, if_<(cents >= 10), coinConverter<0, cents - 10, cent25, cent10 + 1, cent5, cent1>, if_<(cents >= 5), coinConverter<0, cents - 5, cent25, cent10, cent5 + 1, cent1>, coinConverter<0, cents - 1, cent25, cent10, cent5, cent1 + 1>>::result>::result>::result::Cent1, }; }; template struct coinConverter<0, 0, cent25, cent10, cent5, cent1> { enum { Cent25 = cent25, Cent10 = cent10, Cent5 = cent5, Cent1 = cent1, }; }; #define CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(n) \ template \ struct coinConverter<0, ## n ##, cent25, cent10, cent5, cent1> {\ enum { Dolars = 0, Cents = 0, Cent25 = 0, Cent10 = 0, Cent5 = 0, Cent1 = 0 }; }; CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-1) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-2) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-3) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-4) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-5) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-6) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-7) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-8) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-9) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-10) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-11) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-12) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-13) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-14) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-15) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-16) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-17) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-18) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-19) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-20) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-21) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-22) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-23) CREATE_CATCHING_COIN_CONVERTER_TEMPLATE(-24) int main() { typedef coinConverter<0, 6> result; if (result::Cent25) std::cout << "$0.25 : " << result::Cent25 << std::endl; if (result::Cent10) std::cout << "$0.10 : " << result::Cent10 << std::endl; if (result::Cent5) std::cout << "$0.05 : " << result::Cent5 << std::endl; if (result::Cent1) std::cout << "$0.01 : " << result::Cent1 << std::endl; }