pes*_*che 45 c++ static-members header-only
在非模板库类中拥有静态成员的最佳方法是什么,而不必在类用户上承担定义成员的负担?
说我想提供这个课程:
class i_want_a_static_member
{
static expensive_resource static_resource_;
public:
void foo()
{
static_resource_.bar();
}
};
Run Code Online (Sandbox Code Playgroud)
那么类的用户一定不要忘了某处定义静态成员(如已经回答了 很多 次):
// this must be done somewhere in a translation unit
expensive_resource i_want_a_static_member::static_resource_;
Run Code Online (Sandbox Code Playgroud)
我在下面有一个答案,但它有一些缺点.是否有更好和/或更优雅的解决方案?
Mat*_* M. 46
您可以使用函数本地静态变量.
struct Foo
{
inline static int I = 0;
};
Run Code Online (Sandbox Code Playgroud)
pes*_*che 18
我自己的解决方案是使用模板化的持有者类,因为静态成员在模板中工作正常,并使用此持有者作为基类.
template <typename T>
struct static_holder
{
static T static_resource_;
};
template <typename T>
T static_holder<T>::static_resource_;
Run Code Online (Sandbox Code Playgroud)
现在使用持有者类:
class expensive_resource { /*...*/ };
class i_want_a_static_member : private static_holder<expensive_resource>
{
public:
void foo()
{
static_resource_.bar();
}
};
Run Code Online (Sandbox Code Playgroud)
但是,由于成员名称在holder类中指定,因此不能对多个静态成员使用相同的holder.
小智 5
从C ++ 17开始,您现在可以使用内联变量来执行此操作:
static const inline float foo = 1.25f;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10581 次 |
| 最近记录: |