静的アサートは、コンパイル時に物事をチェックするのに非常に便利です。単純な静的アサート イディオムは次のようになります。
template<bool> struct StaticAssert;
template<> struct StaticAssert<true> {};
#define STATIC_ASSERT(condition) do { StaticAssert<(condition)>(); } while(0)
これは次のようなものに適しています
STATIC_ASSERT(sizeof(float) == 4)
と:
#define THIS_LIMIT (1000)
...
STATIC_ASSERT(THIS_LIMIT > OTHER_LIMIT);
しかし、使用#define
は定数を定義する「C++」の方法ではありません。C++ では、匿名の名前空間を使用する必要があります。
namespace {
const int THIS_LIMIT = 1000;
}
あるいは:
static const int THIS_LIMIT = 1000;
これに関する問題は、 をconst int
使用することができずSTATIC_ASSERT()
、ばかげた実行時チェックに頼らなければならないことです。
現在の C++ でこれを適切に解決する方法はありますか?
C++0xにはこれを行うための機能があると読んだと思います...
編集
よし、これで
static const int THIS_LIMIT = 1000;
...
STATIC_ASSERT(THIS_LIMIT > 0);
正常にコンパイルされます
が、これは:
static const float THIS_LIMIT = 1000.0f;
...
STATIC_ASSERT(THIS_LIMIT > 0.0f);
ではない。
(Visual Studio 2008 の場合)
どうして?