如何在自定义类上进行枚举?

时间:2016-09-11 04:01:31

标签: c++ c++14

要最小化,请查看演示代码:

const some_type A,B,C; 
// global constants with non-integral, non-POD, 
// non-trivially copyable type and is very expensive to copy
class cls{
    (const?) some_type(*&?) item;
};

我目前只是使用地图来模仿枚举,但它似乎相当慢。我想要的是确保item中的class cls是以上A,B,C之一,最好是静态的,并提高性能。 (似乎从地图返回会导致地图改变状态或至少进行一些变化,每次分析都很慢)

我尝试在自定义类上使用枚举,但它抱怨底层类型必须是整数类型。应该可以使用reinterpret_cast指针作为解决方法,但仍然不应该这样做,这对吗?

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以使some_type的构造函数为private,只允许一个类构造该类型。

enum 将在该类中实现:

struct some_type {
    // Making copy and move constructor deleted will
    // prevent the creation of any other instances.
    some_type(some_type&&) = delete;
    some_type(const some_type&) = delete;
    some_type& operator=(some_type&&) = delete;
    some_type& operator=(const some_type&) = delete;

    // The `enum`
    static some_type A, B, C;

private:
    // The constructor is private here, only us can construct the type.
    some_type() = default;
};

some_type some_type::A;
some_type some_type::B;
some_type some_type::C;

在以后的代码中,您无法创建或复制此类的实例。 因此,您的类型cls将使用该程序的唯一现有实例:

struct cls {
    cls(const some_type& item_) : item{item_} {}

    const some_type& item;
};

int main() {
    // Working!
    cls myCls{some_type::A};

    // error there, trying to create a new instance that is not A, B or C
    //cls myCls2{some_type{}};
}