gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:29:37 25 4
gpt4 key购买 nike

假设我有以下示例:

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com