【问题标题】:Static member in header-only library仅标头库中的静态成员
【发布时间】:2023-03-31 22:57:02
【问题描述】:

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

【问题讨论】:

标签: c++


【解决方案1】:

假设你说的是静态data成员,既然静态函数成员没问题,那么针对不同情况有多种技术:

  • 简单整型,const,地址未取:
    在类定义的声明中给它一个值。或者您可以使用 enum 类型。

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

  • 不一定是常量,否则不能使用constexpr:
    使用模板化的静态技巧,或 Meyers 的单例。

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

模板化静态技巧示例:

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

免责声明:编译器不会触及任何代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多