提问者:小点点

使用类作为类枚举,或使用特定值


我希望我的函数接受压缩级别(可以取值0..9)。 我希望用户能够手动设置级别compression(7)或使用一些默认值,如compression::highcompression::medium

我想到了以下几点:

class Compression {
public:
    Compression(size_t level) : m_level(level) {};
    static const Compression Medium;
    static const Compression High;
    size_t get() const { return m_level; };
private:
    size_t m_level;
};

const Compression Compression::High{9};
const Compression Compression::Medium{5};

问题是我正在开发一个只有头的库,而这样做导致了“'Compression::High'和'Compression::Medium'的多个定义”。 这个怎么解决?

编辑

挑战:

  • 我只希望有一个作用于压缩选项的函数重载foo(压缩)(foo(size_t)已用于其他内容)。
  • 我坚持使用C++11(可能是C++14,但不会更高)。

共2个答案

匿名用户

GCC版本9.3.0接受代码(C++17):

inline const Compression Compression::High{9};
inline const Compression Compression::Medium{5};

请注意内联字。

匿名用户

不是最好的,但作为最后的手段,您可以使用返回所需实例的静态函数:

class Compression {
public:
    Compression(size_t level) : m_level(level) {};
    static Compression Medium() { return 3; }
    static Compression High() { return 5;}

    size_t get() const { return m_level; };
private:
    size_t m_level;
};

使用它需要额外的():

foo( Compression::High() );

PS:如果您想区分size_tcompression,我建议使构造函数显式,以避免潜在的混淆。 可能出错的一件事是您忘记提供一个条(size_t)重载,并且如下所示:

size_t x = 3;
bar(x);

将意外地以静默方式调用条(压缩)重载。