template auto trait() { using Tag = typename T::Tag; T *t = dynamic_cast(this); if (!t) { return std::nullopt; } if constexpr (std::is_reference_vget(Tag{}))>) { return std::optional(std::reference_wrapper(t->get(Tag{}))); } else { return std::optional(t->get(Tag{})); } }