20 std::vector<std::shared_ptr<element_t>>
elements{};
30 template<
typename... T>
33 (std::derived_from<std::remove_reference_t<T>,
element_t> && ...),
34 "Elements must derive from vg_element_t."
36 (
elements.push_back(make_element<std::remove_reference_t<T>>(std::forward<std::remove_reference_t<T>>(_elements))), ...);
39 template<
typename T,
typename... Args>
42 std::derived_from<std::remove_reference_t<T>,
element_t>,
43 "Elements must derive from vg_element_t."
45 elements.emplace_back(
new std::remove_reference_t<T>{std::forward<Args &&>(args)...});
46 return *
static_cast<T*
>(
elements.back().get());
51 static std::shared_ptr<element_t> make_element(T&& element) {
52 T* ptr =
new T{std::forward<T>(element)};
53 return std::shared_ptr<element_t>(ptr);