gpt4 book ai didi

c++ - 如何在仅 header 库中拥有静态数据成员?

转载 作者:IT老高 更新时间:2023-10-28 14:00:49 26 4
gpt4 key购买 nike

在非模板库类中拥有静态成员的最佳方式是什么?不把定义成员的负担放在类用户身上?

假设我想提供这个类:

class i_want_a_static_member
{
static expensive_resource static_resource_;

public:
void foo()
{
static_resource_.bar();
}
};

那么类的用户一定不要忘记在某处定义静态成员(已经 answered many times ):

// this must be done somewhere in a translation unit
expensive_resource i_want_a_static_member::static_resource_;

我确实在下面有一个答案,但它有一些缺点。有更好和/或更优雅的解决方案吗?

最佳答案

C++17 及以上版本

使用内联静态变量进行非动态初始化:

struct Foo
{
inline static int I = 0;
};

否则使用函数局部静态变量:

struct Foo
{
static std::string& Bar()
{
static std::string S = compute();
return S;
}
};

C++14 及以下

使用函数局部静态,因为它们更容易使用。

如果出于某种原因你真的想要一个静态的数据成员,那么你可以使用模板技巧:

template <typename T = void>
struct Foo
{
static int I = 0; // inline initialization only for simple types.
};

template <typename T>
int Foo<T>::I;

关于局部静态

对于需要动态初始化的资源,最好使用本地静态的。

动态初始化文件范围或类范围静态的顺序是未定义的,通常,当您尝试读取未初始化的静态作为另一个初始化的一部分时,会导致静态初始化顺序失败。本地静态通过在首次使用时延迟初始化来解决问题。

但是,使用局部静态变量有一些开销。从 C++11 开始,初始化需要是线程安全的,这通常意味着任何访问都由原子读取和良好预测的分支控制。

关于c++ - 如何在仅 header 库中拥有静态数据成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11709859/

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