Index: [Article Count Order] [Thread]

Date:  Fri, 05 Jul 2002 16:19:58 +0900
From:  Kenji Hiranabe <hiranabe@....jp>
Subject:  [XP-jp:03553] Re: 書籍紹介 Modern C++ Design
To:  extremeprogramming-jp@....jp
Message-Id:  <20020705161958N.hiranabe@....jp>
In-Reply-To:  Your message of "Wed, 03 Jul 2002 20:30:52 +0900"	<20020703201349.E154.DAXANYA@....jp>
References:  <20020703201349.E154.DAXANYA@....jp>
X-Mail-Count: 03553

平鍋です.

 > だんのです。こんにちは。
 > あぁ、最近この手の本を全然読んでない気がする・・。

だんのさん,こんにちは.お久しぶりです.

>> template<bool> struct CTAssert;
>> template<> CTAssert<true> { };
>> 
>> です.コンパイル時に真と評価されるもののみ,コンパイルされます.
>> 
>> CTAssert< sizeof(char) < sizeof(int) >;
>> 
>> みたいに,使うことができます.

 > これは、プログラムコードを移植する際に、うっかりはまるのを防ぐため
 > のアサートってことですよね?
 > 実際、64bitCPUにコードを移植したりすると、コンパイルが通るのだけど
 > 動きがおかしいということもあるし、そういう時に重宝するのかも。

そうですね,そういう意味だと,#if, #error での対処が普通.

#if !(sizeof(char) < sizeof(int))
#error "not portable !"
#endif

とできるといいのだが,だめ.実際には,

#include <limits.h>
#if !(CHAR_MAX < INT_MAX)
#error "not portable !"
#endif

ですね...

しかし,CTAssert にはもっと違う用途もあって,

template<typename T, int N> class Vector {
   CTAssert< 0 < N >;
   T data[N];
   // ....
};

なんて風に使えるのがおしゃれですね.ただし,エラーメッセージ
は訳分からん.

以上