使用 enum class 编写工厂方法
Using enum class write the factory method
我需要使用 enum class
和带有 static
函数的工厂方法 create
才能创建适当类型的 Object
enum class Object
{
First,
Second,
Third
};
每个对象有 function1
、function2
和 function3
。
我搜索了枚举 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()
的主模板已被删除,因此仅存在其(完整)显式特化的定义。
我需要使用 enum class
和带有 static
函数的工厂方法 create
才能创建适当类型的 Object
enum class Object
{
First,
Second,
Third
};
每个对象有 function1
、function2
和 function3
。
我搜索了枚举 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()
的主模板已被删除,因此仅存在其(完整)显式特化的定义。