说我有以下示例:
#include <cstdlib>
class A {
public:
static const std::size_t value = 42;
};
简而言之,我(或者更好,想要)一个A
个成员static const std::size_t
成员名为value
,成员42
(在编译时确定)。
现在,IIRC,这在某些情况下才能正常工作。例如,当您使用A::value
的地址时,它不会。为了使其在所有情况下都能正常工作,您需要在某些实现文件中添加定义:
const std::size_t A::value;
但是,我不能这样做,因为我希望此文件为仅限标题。另一个常见的解决方案是:
class A {
public:
enum { value = 42 };
};
我也不喜欢这个解决方案,因为我希望A::value
的类型为std::size_t
。
这个问题的解决方案是什么?最好是一个小巧便携的解决方案,而不是像BOOST_STATIC_CONSTANT
那样具有巨大宏观魔力的东西。
我想要一个C ++ 03的解决方案,而不是C ++ 11(那里很简单)。
答案 0 :(得分:8)
首先,对于数字使用未签名的size_t
类型,您可能会遇到隐式促销问题。因此,最好使用其相应的签名类型,称为ptrdiff_t
。实际上,它是指针差异表达式的结果类型。
此外,由于C ++ 11的变化,通常最好包括<stddef.h>
而不是<cstddef>
,即写::ptrdiff_t
或只是ptrdiff_t
,而不是std::ptrdiff_t
。
现在,这里是如何做头文件extern链接常量的事情:
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 );
还有其他一些方法可以做到这一点,但上面是最简单和最容易做到的。