【发布时间】:2015-01-24 00:09:18
【问题描述】:
我在想其中之一:
#if sizeof(size_t) == 8
const size_t foo = 12345;
#elif sizeof(size_t) == 4
const size_t foo = 123;
#else
#error "Unsupported size_t size"
#endif
或
template <int S> class Foo { static const size_t foo = 0; };
template <> class Foo<8> { static const size_t foo = 12345; };
template <> class Foo<4> { static const size_t foo = 123; };
const size_t foo = Foo<sizeof(size_t)>::foo;
另外,如何使用第二种方法引发编译时错误?
【问题讨论】:
-
第二种方法可以使用
std::static_assert。 -
#if不知道sizeof。不过,您可以使用来自limits.h的一些宏,例如SIZE_MAX. -
@MattMcNabb 这是一个很好的观点,我忘记了。而
SIZE_MAX仅在我关心的实际上是size_t(或其他标准类型之一)时才有效,但不一定如此。 -
这些值是遵循某种逻辑还是任意的?看看
numeric_limits -
@NeilKirk,他们遵循一些逻辑,但逻辑对于编译时计算来说太复杂了。绝对不是
numeric_limits可以解决的问题。目前,我正在处理为 32 位和 64 位整数类型分配一个适当大的素数。
标签: c++ templates c-preprocessor compile-time-constant