c++ - 将类类型存储为映射值并根据映射键初始化新类

标签 c++ class types

我想编写一个函数,根据从枚举到类类型的静态映射返回一个新的类实例。

Base* getBase(Enum e) {
    static const map<Enum, class type???> base_map = {
        { EnumA, Derived1 }, // Derived1,2,3 are subclasses of Base
        { EnumB, Derived2 },
        { EnumC, Derived3 },
    };
    return new base_map[e];
}

是否可以在 C++ 中执行此操作?如果是这样, map 的值(value)应该是什么类型? 我想我可以使用很长的 if-else 来达到同样的效果,但使用 map 似乎更干净。

最佳答案

您可以存储一个工厂函数 - 大致如下:

Base* getBase(Enum e) {
    typedef std::function<Base*()> maker_t;
    static const map<Enum, maker_t> base_map = {
        { EnumA, [] { return new Derived1; } },
        { EnumB, [] { return new Derived2; } },
        { EnumC, [] { return new Derived3; } }
    };
    return base_map[e]();
}

关于c++ - 将类类型存储为映射值并根据映射键初始化新类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27894130/

相关文章:

c++ - 未识别的 C++ 函数引用

c++ - 初始化列表似乎取决于类中变量的顺序

c++ - 将运算符>>重载到 C++ 中的字符缓冲区 - 我可以告诉流长度吗?

haskell - 函数类型签名中的右结合性

scala - 将两个类型通配符标识为相同

C++:是否可以将方法分配给同一类中的函数指针成员(属性)?

python - 一个类中多个方法的if条件

java - Java中关于多个类的继承

Python 类设计 : explicit keyword arguments vs. **kwargs 与 @property

programming-languages - 标量与原始数据类型 - 它们是同一件事吗?