7

假设我有以下示例:

#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;

但是,我不能这样做,因为我希望这个文件是header-only。另一个常见的解决方案是:

class A {
public:
    enum { value = 42 };
};

我也不喜欢这种解决方案,因为我希望类型A::valuestd::size_t.

这个问题有什么好的解决方案?最好是一个小巧便携的解决方案,而不是像BOOST_STATIC_CONSTANT.


我想要 C++03 的解决方案,而不是 C++11(在那里很简单)。

4

1 回答 1

8

首先,size_t对数字使用无符号类型,您可能会遇到隐式提升问题。因此,使用其对应的有符号类型是个好主意,称为ptrdiff_t. 碰巧的是,它是指针差异表达式的结果类型。

此外,由于 C++11 的变化,通常最好包含<stddef.h>and not <cstddef>,即 write ::ptrdiff_t or just plain ptrdiff_t, not 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 );

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

于 2012-09-07T22:15:04.530 回答