9#include <unordered_map>
58template<
class ClassId,
class BaseClass,
class... Args>
61 using BasePtr = std::shared_ptr<BaseClass>;
62 using CreatorFn = BasePtr (*)(Args...);
75 template<
class Derived>
77 static_assert(std::is_base_of_v<BaseClass, Derived>,
78 "Derived must inherit from BaseClass");
79 static_assert(std::is_constructible_v<Derived, Args...>,
80 "Derived must be constructible from Args...");
82 classes.insert_or_assign(
id, &instantiate<Derived>);
89 [[nodiscard]] CreatorFn
creator(
const ClassId &
id)
const {
90 return classes.at(
id);
97 [[nodiscard]] BasePtr
create(
const ClassId &
id, Args... args)
const {
98 return creator(
id)(std::move(args)...);
104 [[nodiscard]]
bool contains(
const ClassId &
id)
const {
105 return classes.find(
id) != classes.end();
110 std::unordered_map<ClassId, CreatorFn> classes;
113 template<
class Derived>
114 static BasePtr instantiate(Args... args) {
115 return std::make_shared<Derived>(std::move(args)...);
Registry-based factory for creating objects by runtime identifier.
bool contains(const ClassId &id) const
Checks whether an id is registered.
BasePtr create(const ClassId &id, Args... args) const
Creates an instance for the given id using provided arguments.
void registerType(const ClassId &id)
Registers a Derived type under the given id.
CreatorFn creator(const ClassId &id) const
Returns creator function for the given id.