什么是有一个非模板库类的静态成员,而不将定义的类用户的成员的负担的最好方法?
说我要提供这个类:
class i_want_a_static_member
{
static expensive_resource static_resource_;
public:
void foo()
{
static_resource_.bar();
}
};
那么类的用户一定不要忘了某处定义静态成员(如已经回答了 很多 次 ):
// this must be done somewhere in a translation unit
expensive_resource i_want_a_static_member::static_resource_;
我有下面的答案,但它也有一些缺点。 是否有更好的和/或更优雅的解决方案?
您可以使用函数局部静态变量。
struct Foo {
static int& Bar() { static int I; return I; }
}; // ^~~~~~~~~~~~
我自己的解决方案是使用一个模板支架类,静态成员在模板中正常工作,并以此作为持有人的基类。
template <typename T>
struct static_holder
{
static T static_resource_;
};
template <typename T>
T static_holder<T>::static_resource_;
现在使用holder类:
class expensive_resource { /*...*/ };
class i_want_a_static_member : private static_holder<expensive_resource>
{
public:
void foo()
{
static_resource_.bar();
}
};
但是,随着在支架类指定的成员的名字,你不能使用相同的持有人不止一个静态成员。
由于C ++ 17.现在,您可以使用内联变量来做到这一点:
static const inline float foo = 1.25f;