Index: [Article Count Order] [Thread]

Date:  Tue, 7 Nov 2000 19:10:00 +0900
From:  Kenji Hiranabe <hiranabe@....jp>
Subject:  [XP-jp:01150] Re: C プログラミング診断室というのがありました
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <20001107190430N.hiranabe@....jp>
In-Reply-To:  Your message of "Tue, 7 Nov 2000 15:57:56 +0900"	<20001107064210639.AAA243@....jp@ginza>
References:  <20001107064210639.AAA243@....jp@ginza>
Posted:  Tue, 07 Nov 2000 19:04:30 +0900
X-Mail-Count: 01150

寺田さんこんにちは.
平鍋です.

On Tue, 7 Nov 2000 15:57:56 +0900,
yterada@....jp (Y.Terada) said:

 > こんにちは,寺田@東工大 です.
 > こちらの ML には初めて投稿します.よろしくお願いします.
 > XP はまだよく分かっていませんが,単純に「ほかの方法論より楽しそう」というだけの
 > 理由でこの ML を読んでます.実際に効果的なのかどうかは,実務経験がないのでいまい
 > ちイメージが湧かない,というのが本音です.

現在,たぶん XP 経験がある人はごく小数(片手で数えられる)です.

 > で,初めての投稿が全然 XP と関係なくて大変恐縮なのですが,パズルを解く感覚で階乗
 > 計算のプログラムを解読してみましたので...

 > # あぁ,なんてヒマな学生なんだ(笑)

>> でも,このマクロを駆使したギミック言語の延長に,generative
>> programming がある,と捉えることもできますね.gp は,例えば
>> こんな感じです.コンパイルタイムに階乗計算を行うための C++
>> template です.(James Coplien から教わったものですが,もはや
>> 解読不能)


>> template <bool condition, class Then, class Else>
>> struct IF { typedef Then RET; };
>> 
>> template <class Then, class Else>
>> struct IF<false, Then, Else> { typedef Else RET; };

 > この部分は,次のような意味ですね.

 > struct IF<true,  Then, Else> { typedef Then RET; };
 > struct IF<false, Then, Else> { typedef Else RET; };

 > 要するに,
 >     IF<条件式, A, B>::RET
 > と書くと,
 >     条件式が真の場合 → A になる
 >     条件式が偽の場合 → B になる

 > すると,

>> template <int n> struct fact {
>> typedef
>> IF<n==0, One, fact<n-1> >::RET PreviousFactorial;
>> enum { RET = (n ==0)
>> ? PreviousFactorial::RET
>> :  PreviousFactorial::RET * n};
>> };

 > この部分は,以下のように解釈できます.

 > // n == 0 の場合
 > struct fact<0> {
 >     enum { RET = One::RET };
 > };

 > // n > 0 の場合
 > struct fact<n> {	// n > 0
 >     enum { RET = fact<n-1>::RET * n };
 > };

 > ですので,
 >     fact<n>::RET
 > で n! の値を得ることができます.

解説ありがとうございました.納得です.
初めてこれを人間が展開したのをみました ^^; さすがです.

 > でも,こんなの,もっと簡単にできますよねぇ.
 > 複雑な書き方をしたのには何か深遠な理由があったのでしょうか.
 > たとえばこう書いちゃえばすごく簡単です.

 > #incldue <iostream>
 > using namespace std;

 > template<int n>
 > struct fact     { enum{ RET = n * fact<n-1>::RET}; };

 > template<>
 > struct fact<0>  { enum{ RET = 1}; };

 > int main(){
 >     cout << "5! = " << fact<5>::RET << endl;
 >     return 0;
 > }

 > おお! もしかしてこれは,gp のりファクタリング?

はいはい,generative programming という本では,上記例も紹介
されています.IF テンプレートは,WHILE, SWITCH などの他の要
素も定義することによって,C++ の template 上にメタ言語を構成
する,というコンテキストで,最初の例が出てきています.

 > と,無理やり XP ネタにもっていったところで,失礼します.
 > 本当に XP と関係ないメールですいません.
 > それでは.

 > PS:
 > 主に強調したかったのは IF<condition, Then, Else> なんでしょうか.
 > 階乗を求める fact<n> は IF<condition, Then, Else> の単なる適用例であって,
 > メインではなかったのでは...?
 > 確かに,IF<condition, Then, Else> は他にも使えそうです.
 > そう考えれば,複雑な書き方になっているのにも納得できます.

お察しの通り,それが目的です.
とはいえ,解説ありがとうございました.

以上