使用枚举类编写工厂方法

问题描述 投票:0回答:1

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

enum class Object
{
   First,
   Second,
   Third
};

每个对象都有function1function2function3

我搜索了枚举类和工厂方法,但不知道如何将它们结合在一起。

c++ class c++11 enums factory
1个回答
2
投票

[通常在[上参数化工厂方法,例如名为ObjectObject::create()工厂,例如覆盖非类型模板参数(例如枚举),例如ObjectTag。在Object::create()上参数化的ObjectTag功能模板公开了一种公共工厂方法,该方法专门用于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()的主要模板已被删除,因此仅存在其(全部)显式专业的定义。
© www.soinside.com 2019 - 2024. All rights reserved.