标头库中的静态成员

Dej*_*aVu 6 c++

我正在创建仅限标头的库,我必须使用静态成员.
是否可以在头文件中定义它而不重新定义警告?

Che*_*Alf 10

假设您正在谈论静态数据成员,因为静态函数成员没有问题,针对不同情况有各种技术:

  • 简单的整数类型,const未采用的地址:
    在类定义的声明中给它一个值.或者你可以使用一种enum类型.

  • 其他类型,逻辑上不变:
    使用C++ 11 constexpr.

  • 不一定是常数,或者你不能使用constexpr:
    使用模板化的静态技巧或Meyers的单例.

迈耶斯单身人士的例子:

class Foo
{
private:
    static
    auto n_instances()
        -> int&
    {
         static int the_value;
         return the_value;
    }
public:
    ~Foo() { --n_instances(); }
    Foo() { ++n_instances(); }
    Foo( Foo const& ) { ++n_instances(); }
};
Run Code Online (Sandbox Code Playgroud)

模板化静态技巧的示例:

template< class Dummy >
struct Foo_statics
{
    static int n_instances;
};

template< class Dummy >
int Foo_statics<Dummy>::n_instances;

class Foo
    : private Foo_statics<void>
{
public:
    ~Foo() { --n_instances; }
    Foo() { ++n_instances; }
    Foo( Foo const& ) { ++n_instances; }
};
Run Code Online (Sandbox Code Playgroud)

免责声明:编译器没有触及任何代码.