17 #include <unordered_map> 30 class element_base {};
31 using element_id_t = char;
32 using element_key = std::type_index;
39 using container_type = C;
41 explicit holder(
const std::shared_ptr<C>& ctx)
44 virtual ~
holder() =
default;
46 std::shared_ptr<C>
context()
const {
return _context; }
48 std::shared_ptr<C> _context;
56 using container_type = C;
58 explicit element(
const std::shared_ptr<C>& ctx)
63 std::shared_ptr<C>
context()
const {
return _context.lock(); }
65 std::weak_ptr<C> _context;
76 template <
class T,
typename ... Args>
77 typename std::enable_if<std::is_base_of<element_base, T>::value, std::shared_ptr<T>>::type
80 element_key key(
typeid(T));
81 auto it = _elements.find(key);
82 if (it != _elements.end())
84 return std::static_pointer_cast<T>(it->second);
86 auto result = instantiate<T>(std::forward<Args>(args)...);
87 _elements.insert(std::make_pair(key, result));
92 template <
typename T,
typename ... Args>
93 typename std::enable_if<std::is_base_of<holder, T>::value, std::shared_ptr<T>>::type
96 return instantiate<T>(std::forward<Args>(args)...);
100 std::unordered_map<element_key, std::shared_ptr<element_base>> _elements;
102 template<
class T,
class... Args>
103 std::enable_if_t<std::is_constructible<T, std::shared_ptr<C>, Args&&...>::value, std::shared_ptr<T>>
104 instantiate(Args&&...args)
106 return std::make_shared<T>(
static_cast<C*
>(
this)->shared_from_this(), std::forward<Args>(args)...);
109 template<
class T,
class... Args>
110 std::enable_if_t<!std::is_constructible<T, std::shared_ptr<C>, Args&&...>::value, std::shared_ptr<T>>
111 instantiate(Args&&...args)
113 throw std::logic_error(
"Cannot instantiate class.");
Context holder base class.
std::shared_ptr< C > context() const
Get container/context reference.
Base class for service lookup containers.
Base class for objects onwed by container/context.
std::shared_ptr< C > context() const
Get container/context reference.