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; }