gpt4 book ai didi

c++ - 在 C++ 中是否可以遍历抽象类的所有子类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:10 25 4
gpt4 key购买 nike

我在 C++ 中有一个带有多个子类的抽象类。

是否可以通过宏或模板元编程以某种方式做这样的事情:

foreach subclass of Base:
mymap[subclass::SOME_CONSTANT] = new subclass();

最佳答案

不,你不能。

显然,您想要的是一个工厂(或者可能是抽象工厂)。

在 C++ 中,您设置工厂类并注册构建器。

class FooFactory
{
public:
typedef std::function<Foo*()> Builder;

/// returns true if the registration succeeded, false otherwise
bool Register(std::string const& key, Builder const& builder) {
return map.insert(std::make_pair(key, builder)).second;
}

/// returns a pointer to a new instance of Foo (or a derived class)
/// if the key was found, 0 otherwise
Foo* Build(std::string const& key) const {
auto it = _map.find(key);
if (it == _map.end()) { return 0; } // no such key
return (it->second)();
}

private:
std::map<std::string, Builder> _map;
};

您可以创建该工厂的单例,以在库加载期间注册派生类,这对于类似插件的架构非常方便:

FooFactory& GetFooFactory() { static FooFactory F; return F; }

你可以准备一个方便的构建器:

template <typename Derived>
Foo* fooBuilder() { return new Derived(); }

然后人们期望在工厂中注册他们的派生类:

static const bool registeredBar =
GetFooFactory().Register("Bar", fooBuilder<Bar>);

注意:工厂应该是单例远非强制性的,尽管它在这里并不那么邪恶,因为一旦库的加载结束它就会保持不变。

注意:对于正确的插件架构,您需要使用 RAII(而不是 bool)来处理库卸载时的注销。不过这种情况要少得多。

关于c++ - 在 C++ 中是否可以遍历抽象类的所有子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5450742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com