templaet metaprogrammingの練習

既出感がプンプンするものの、気にせず投下。和、階乗、累乗、ビットマスクです。
ところで今、かな入力の練習にとかな入力で書き込みをしていまする。なんとなく分かってきたけど、それでもローマ字入力に比べてまだ100倍くらい時間が掛かる。全角の「?」とかどうやって入力すればいいんだ・・・。

#include <iostream>

//和 (これなんて呼べばいいの)
template<size_t n> struct sum{
    enum{ val = n * (n + 1) >> 1 };
};
//template<size_t n> struct sum{
//    enum{ val = sum<n - 1>::val + i };n
//};
//template<> struct sum<1>{
//    enum{ val = 1 };
//};

//階乗
template<size_t n> struct fact{
    enum{ val = fact<n - 1>::val * n };
};
template<> struct fact<2>{
    enum{ val = 2 };
};

//累乗
template<size_t n, size_t i> struct spow{
    enum{ val = spow<n, i - 1>::val * n };
};
template<size_t n> struct spow<n, 0>{
    enum{ val = 1 };
};

//ビットマスク
template<size_t bitnum> class bitmask{
    template<size_t n> struct iv{
        enum{ val = n | iv<(n >> 1)>::val };
    };
    template<> struct iv<1>{
        enum{ val = 1 };
    };

public:
    enum{ val = iv<spow<2, bitnum - 1>::val>::val };
};
template<> struct bitmask<0>{
    enum{ val = 0 };
};

int main(){
    using namespace std;
    cout << "sum<100>    : " << sum<100>::val << endl;// 100 + 99 + 98 + ... 1
    cout << "fact<10>    : " << fact<10>::val << endl;   // 10 * 9 * 8 * ... 1
    cout << "spow<2, 16> : " << spow<2, 16>::val << endl;// 2^16

    //23bit長のbitmask
    cout << "bitmask<23> : " << hex << uppercase
        << bitmask<23>::val << endl;

    return 0;
}