【问题标题】:Using enum class write the factory method使用枚举类编写工厂方法
【发布时间】:2023-04-09 12:34:01
【问题描述】:

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

enum class Object
{
   First,
   Second,
   Third
};

每个对象都有function1function2function3

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

【问题讨论】:

  • 更具体地了解您的问题会有所帮助
  • 我只看到一个枚举。你为实现自己的目标而努力过什么?目前这个问题看起来像“请写我的代码”。

标签: c++ class c++11 enums factory


【解决方案1】:

通过标签参数化一个工厂方法是很常见的,比如一个名为Object::create()Object工厂,例如在诸如枚举之类的非类型模板参数上,例如ObjectTag。在ObjectTag 上参数化的Object::create() 函数模板公开了一个公共工厂方法,该方法专门用于ObjectTag 枚举的每个特定枚举器,然后使用例如Object 的私有构造函数,未在其公共 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() 的主模板已被删除,因此仅存在其(完整)显式特化的定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多