我需要使用enum class
和带有static
函数create
的工厂方法,才能创建适当类型的Object
enum class Object
{
First,
Second,
Third
};
每个对象都有function1
,function2
和function3
。
我搜索了枚举类和工厂方法,但不知道如何将它们结合在一起。
[通常在[Object
的Object::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()
的主要模板已被删除,因此仅存在其(全部)显式专业的定义。