使用 enum class 编写工厂方法

Using enum class write the factory method

我需要使用 enum class 和带有 static 函数的工厂方法 create 才能创建适当类型的 Object

enum class Object
{
   First,
   Second,
   Third
};

每个对象有 function1function2function3

我搜索了枚举 class 和工厂方法,但不知道如何组合它们。

标签 上参数化工厂方法很常见,比如一个名为 Object::create()Object 工厂,例如在非类型模板参数(例如枚举)上,比如 ObjectTag。在 ObjectTag 上参数化的 Object::create() 函数模板公开了一个 public 工厂方法,该方法专用于 ObjectTag 枚举的每个特定枚举器,并且依次使用例如Object 的私有构造函数,未在其 public API.

中公开
#include <iostream>

enum class ObjectTag
{
   kFirst,
   kSecond,
   kThird
};

struct Object {
    template <ObjectTag TAG>
    static Object create() = delete;

    void foo() const { std::cout << foo_ << "\n"; }

private:
    explicit Object(const int foo) : foo_(foo) {}
    int foo_;
};

template<>
Object Object::create<ObjectTag::kFirst>() { return Object(11); }

template<>
Object Object::create<ObjectTag::kSecond>() { return Object(22); }

template<>
Object Object::create<ObjectTag::kThird>() { return Object(33); }

int main() {
    const auto a = Object::create<ObjectTag::kFirst>();
    const auto b = Object::create<ObjectTag::kSecond>();
    const auto c = Object::create<ObjectTag::kThird>();
    a.foo();  // 11
    b.foo();  // 22
    c.foo();  // 33
}

请注意,成员函数模板 Object::create() 的主模板已被删除,因此仅存在其(完整)显式特化的定义。