c++ - 仅 header 文件中的静态 const 整数类成员 - 正确的方法?

标签 c++ static constants member

假设我有以下示例:

#include <cstdlib>

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

简而言之,我有(或者更好的是,想要)一个类 A 和一个名为 valuestatic const std::size_t 成员值 42(在编译时确定)。

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

const std::size_t A::value;

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

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

我也不喜欢这个解决方案,因为我希望 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 .

现在,这里是如何处理头文件外部链接常量的事情:

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

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

关于c++ - 仅 header 文件中的静态 const 整数类成员 - 正确的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12325871/

相关文章:

c++ - ffmpeg:对 'uncompress' 的 undefined reference

c++ - 将函数应用于包含的对象,前提是它们派生自基类型

java - 不能从静态上下文中引用非静态方法(方法名称())。为什么?

c++ - 如果返回类型为 static const 时返回非静态本地会发生什么

c# - 常量与只读

haskell - Haskell 代数数据类型中的常量

c++ - boost::spirit char/string 混合

c++ - 编译器可移植PDB(程序数据库)?

java - 使用静态工厂样式构造函数将元素添加到一个或多个静态列表

c - typedef 指针常量怪异