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

orl*_*rlp 7 c++ static const member

说我有以下示例:

#include <cstdlib>

class A {
public:
    static const std::size_t value = 42;
};
Run Code Online (Sandbox Code Playgroud)

简而言之,我有一个类(或者更好,想要)一个带有值Astatic const std::size_t成员(在编译时确定).value42

现在,IIRC,这在某些情况下才能正常工作.例如,当你拿地址时,它不会A::value.为了使其在所有情况下都能正常工作,您需要在某个实现文件中添加定义:

const std::size_t A::value;
Run Code Online (Sandbox Code Playgroud)

但是,我不能这样做,因为我希望这个文件只是标题.另一种常见的解决方案是:

class A {
public:
    enum { value = 42 };
};
Run Code Online (Sandbox Code Playgroud)

我不喜欢这样的解决方案,因为我想要的类型A::valuestd::size_t.

什么是这个问题的好方法?最好是一个小巧便携的解决方案,而不是具有巨大宏观魔力的东西BOOST_STATIC_CONSTANT.


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

Che*_*Alf 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
};
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

foo( A::value );
Run Code Online (Sandbox Code Playgroud)

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