如何在一个只有标题库静态数据成员?(How to have static data members

2019-06-17 14:28发布

什么是有一个非模板库类的静态成员,而不将定义的类用户的成员的负担的最好方法?

说我要提供这个类:

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

我有下面的答案,但它也有一些缺点。 是否有更好的和/或更优雅的解决方案?

Answer 1:

您可以使用函数局部静态变量。

struct Foo {
     static int& Bar() { static int I; return I; }
}; //                    ^~~~~~~~~~~~


Answer 2:

我自己的解决方案是使用一个模板支架类,静态成员在模板中正常工作,并以此作为持有人的基类。

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

但是,随着在支架类指定的成员的名字,你不能使用相同的持有人不止一个静态成员。



Answer 3:

由于C ++ 17.现在,您可以使用内联变量来做到这一点:

static const inline float foo = 1.25f;


文章来源: How to have static data members in a header-only library?