#pragma once #include /// \brief Обёртка для связей, чтобы сделать их типизированными. /// Типизированная связь позволяет подключать только узлы заданного типа. /// \tparam TElem Тип элемента. /// \tparam TBase Базовый Link. После проверки типа, управление передаётся этому классу. /// \tparam TExpected Опциональный ожидаемый конкретный тип детей. /// Если не задан, сравниваем с родителем. template class TypedLink : public TBase { public: using ElemPtr = std::shared_ptr; TypedLink(ElemPtr e) : TBase(e) {} void addChild(const ElemPtr& child) override { /* Validate type according to policy */ if constexpr (std::is_void_v) { /* Default behavior: child must be exactly the same type as parent */ if (typeid(*child) != typeid(*this->owner_node_.lock())) throw std::logic_error("Foundling child"); } else { /* Explicit expected child type */ if (typeid(*child) != typeid(TExpected)) throw std::logic_error("Unexpected child type"); } TBase::addChild(child); } };