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)
简而言之,我有一个类(或者更好,想要)一个带有值A的static 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::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.
现在,这里是如何做头文件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)
还有其他一些方法可以做到这一点,但上面是关于最简单和最简单的方法.