soraなりの日々 - fc2 -

こころにひっかかったもの

[c++]template metaprogramming

c++ を久しぶりに。

"c++ とは"ってのを言い出すと人によって
いろいろとあるんだろけど、、、
(new に始まり delete で終るとかね。
 まさにその通りだと思う。)

けど、オイラの中では "c++ できます"って
言える人というのは既存のライブラリ
如何に使いこなせてるかだと思うのね。
c あがりな人の場合は特に!

このエントリーをはてなブックマークに追加
そんなんだから、オイラは覚えたものは
リスク関係なく使ってしまう訳です。
もちろん、ちゃんと検証するし利点もわかった上でね。

std::vector 使ってるのに iterator 使ってなかったり
した prj には即使ったりしたしね。

そんで、いろいろ節操なく使った結果、思うのは、
"c++ が c++ たらんとするのは template 機能があるから"
だとも思う訳ですよ。

強力な stl(standard template library)しかりね。

std::string も std::vector も。
あと、コレで使った std::map もやっぱ凄い訳です。

とか、なんとか。
生意気にも思ってるオイラでもコレを見つけた時は
いままでの template 機能の使い方とはかけ離れており(自分的にね)
結構、ぶっとんだ!
こういうのが発想の転換てやつなんだろね(^^;

では、いってみよー。

まずは単なる recursive。
#include "stdafx.h"
#include <iostream>
#include <time.h>

using namespace std;

int recursive(int n)
    {
    if (n<=0)
        {
        return 1;
        }
    return n * recursive(n-1);
    }

int _tmain(int argc, _TCHAR* argv[])
    {
    clock_t start,end;
    start = clock();

    cout << recursive(4) << endl;

    end = clock();
    printf("%.5f sec\n",(double)(end-start)/CLOCKS_PER_SEC);

    return 0;
    }

まー、単に数値の 4 を与えてるんで
4 * 3 * 2 * 1 の合計の 24 を表示する。

で、これを template 機能を使って
再帰でやってみるとこうなる。

#include "stdafx.h"
#include <iostream>
#include <time.h>

using namespace std;

template <int N> struct Factorial
    {
    enum { val = Factorial<N-1>::val * N };
    };


template<>
struct Factorial<0>
    {
    enum { val = 1 };
    };

int _tmain(int argc, _TCHAR* argv[])
    {
    // Note this value is gerenated at compile time.
    // Also note that most compilers have a limit on the depth of the recursion available.
    clock_t start,end;
    start = clock();

    cout << Factorial<4>::val << "\n";

    end = clock();
    printf("%.5f sec\n",(double)(end-start)/CLOCKS_PER_SEC);

    return 0;

    }

凄くないですか?
ココで知った、もっと詳細に速度を測るヤツで
何度も測定してみたけど速度的には大差ない感じ。

保守性とか考えると、まー、微妙なところかも
知れないけど、そこらは教育すればどーとでもなる
話な訳で、、、

こんなすっきりするならやっちゃっても良いんでない?
と思う訳ですよ。
これは int 固定だけど、float だろうがなんだろうが
template の機能を使えばなんでもこいになる訳だし。。。

てことで、まとめとしてはやっぱアレだね。

c++ 楽しいっす!
いくらやっても極めきれないス。。。

ps:
 でもアレだね。
 この発想自体は、wikipedia にもあるし
 結構古かったりするんだろね。
 オイラがたまたま stack overflow とかで
 知っただけだろね。。。
 もっと勉強しなきゃなー。
このエントリーをはてなブックマークに追加

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://sora2hs.blog70.fc2.com/tb.php/396-98359a80
この記事にトラックバックする(FC2ブログユーザー)