// -*-c++-*- // vim: set ft=cpp: /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include <typeinfo> #include <cm/type_traits> namespace cm { template < typename T, typename O, cm::enable_if_t<std::is_pointer<decltype(std::declval<O>().get())>::value, int> = 0> T& static_reference_cast(O& item) { return *(static_cast<T*>(item.get())); } template < typename T, typename O, cm::enable_if_t<std::is_pointer<decltype(std::declval<O>().get())>::value, int> = 0> T& dynamic_reference_cast(O& item) { auto p = dynamic_cast<T*>(item.get()); if (p == nullptr) { throw std::bad_cast(); } return *p; } } // namespace cm