10#include <unordered_map>
20 template<
typename T,
typename... Args>
23 return createImpl<T>(
typeid(T).name(), std::forward<Args>(args)...);
26 template<
typename T,
typename... Args>
29 return createImpl<T>(typeName, std::forward<Args>(args)...);
36 std::type_index(
typeid(T)), [
this](std::any args) -> std::unique_ptr<void, Deleter>
37 {
return std::unique_ptr<void, Deleter>(
new T(std::any_cast<
decltype(args)>(args)),
Deleter{
this}); },
38 [](
void* ptr) {
delete static_cast<T*
>(ptr); }};
44 std::vector<T*> result;
47 if (pair.second.typeIndex == std::type_index(
typeid(T)))
49 result.push_back(
static_cast<T*
>(pair.second.ptr.get()));
58 [ptr](
const auto& pair) { return pair.second.ptr.get() == ptr; });
67 std::cout <<
"ObjectFactory destructor: Cleaning up all objects." << std::endl;
84 std::unique_ptr<void, Deleter>
ptr;
92 std::function<std::unique_ptr<void, Deleter>(std::any)>
creator;
99 template<
typename T,
typename... Args>
105 throw std::runtime_error(
"Unknown type: " + typeName);
108 auto any_args = std::make_any<decltype(std::make_tuple(std::forward<Args>(args)...))>(
109 std::make_tuple(std::forward<Args>(args)...));
110 auto unique_ptr = it->second.creator(any_args);
111 T* ptr =
static_cast<T*
>(unique_ptr.get());
Definition ObjectFactory.hpp:16
~ObjectFactory()
Definition ObjectFactory.hpp:65
T * create(Args &&... args)
Definition ObjectFactory.hpp:21
std::unordered_map< void *, ObjectInfo > m_objects
Definition ObjectFactory.hpp:97
void registerType(const std::string &typeName)
Definition ObjectFactory.hpp:33
std::vector< T * > getObjects() const
Definition ObjectFactory.hpp:42
std::unordered_map< std::string, TypeInfo > m_typeInfo
Definition ObjectFactory.hpp:96
T * createImpl(const std::string &typeName, Args &&... args)
Definition ObjectFactory.hpp:100
T * createByName(const std::string &typeName, Args &&... args)
Definition ObjectFactory.hpp:27
void deleteObject(void *ptr)
Definition ObjectFactory.hpp:55
Definition Singleton.hpp:5
Definition ObjectFactory.hpp:73
ObjectFactory * factory
Definition ObjectFactory.hpp:74
void operator()(void *ptr) const
Definition ObjectFactory.hpp:76
Definition ObjectFactory.hpp:83
std::type_index typeIndex
Definition ObjectFactory.hpp:85
std::unique_ptr< void, Deleter > ptr
Definition ObjectFactory.hpp:84
std::function< void(void *)> deleter
Definition ObjectFactory.hpp:86
Definition ObjectFactory.hpp:90
std::type_index typeIndex
Definition ObjectFactory.hpp:91
std::function< void(void *)> deleter
Definition ObjectFactory.hpp:93
std::function< std::unique_ptr< void, Deleter >(std::any)> creator
Definition ObjectFactory.hpp:92