标题文件中的静态const整数类成员 - 正确的方法?

时间:2012-09-07 21:52:16

标签: c++ static const member

说我有以下示例:

#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(那里很简单)。

1 个答案:

答案 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 );

还有其他一些方法可以做到这一点,但上面是最简单和最容易做到的。