假设我有以下示例:
#include <cstdlib>
class A {
public:
static const std::size_t value = 42;
};
简而言之,我有(或者更好的是,想要)一个类 A
和一个名为 value
的 static const std::size_t
成员值 42
(在编译时确定)。
现在,IIRC,这只在特定情况下才能正常工作。例如,当您获取 A::value
的地址时,它不会。为了使其在所有情况下都能正常工作,您需要在一些实现文件中添加一个定义:
const std::size_t A::value;
但是,我不能这样做,因为我希望这个文件是header-only。另一个常见的解决方案是:
class A {
public:
enum { value = 42 };
};
我也不喜欢这个解决方案,因为我希望 A::value
的类型是 std::size_t
。
这个问题有什么好的解决方案?最好是小型便携解决方案,而不是像 BOOST_STATIC_CONSTANT
这样具有巨大宏魔法的解决方案。
我想要一个针对 C++03 的解决方案,而不是 C++11(那里很简单)。
最佳答案
首先,使用未签名的size_t
键入数字,您可能会遇到隐式提升问题。所以,使用它相应的签名类型是个好主意,它被称为 ptrdiff_t
.这恰好是指针差异表达式的结果类型。
此外,由于 C++11 中的变化,包含 <stddef.h>
通常是个好主意而不是 <cstddef>
,即写::ptrdiff_t
或者只是普通的 ptrdiff_t
, 不是 std::ptrdiff_t
.
现在,这里是如何处理头文件外部链接常量的事情:
template< class Dummy >
struct A_constants_
{
static ::ptrdiff_t const value;
};
template< class Dummy >
::ptrdiff_t const A_constants_<Dummy>::value = 42;
typedef A_constants_<void> A_constants;
class A
: public A_constants
{
public:
// Whatever
};
然后你可以像这样使用它:
foo( A::value );
还有一些其他方法可以做到这一点,但以上是最简单和最容易正确的方法。
关于c++ - 仅 header 文件中的静态 const 整数类成员 - 正确的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12325871/