繁体   English   中英

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

[英]Static const integer class member in header-only file - the proper way?

说我有以下示例:

#include <cstdlib>

class A {
public:
    static const std::size_t value = 42;
};

总之,我有(或更好的,想要的)的一类Astatic 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(那里很简单)。

首先,对数字使用unsigned size_t类型,您可能会遇到隐式促销问题。 因此,最好使用其相应的签名类型,称为ptrdiff_t 实际上,它是指针差异表达式的结果类型。

此外,由于C ++ 11的变化,通常最好包括<stddef.h>而不是<cstddef> ,即write ::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 );

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM