@@ -99,6 +99,11 @@ namespace edm {
9999 size_t key () const ;
100100
101101 template <class REF >
102+ requires requires {
103+ typename REF::value_type;
104+ requires std::is_same_v<T, typename REF::value_type> or std::is_base_of_v<T, typename REF::value_type> or
105+ std::is_base_of_v<typename REF::value_type, T>;
106+ }
102107 REF castTo () const ;
103108
104109 bool isNull () const ;
@@ -228,43 +233,20 @@ namespace edm {
228233 return holder_->key ();
229234 }
230235
231- namespace {
232- // If the template parameters are classes or structs they should be
233- // related by inheritance, otherwise they should be the same type.
234- template <typename T, typename U>
235- typename std::enable_if<std::is_class<T>::value>::type checkTypeCompatibility () {
236- static_assert (std::is_base_of<T, U>::value || std::is_base_of<U, T>::value,
237- " RefToBase::castTo error element types are not related by inheritance" );
238- }
239-
240- template <typename T, typename U>
241- typename std::enable_if<!std::is_class<T>::value>::type checkTypeCompatibility () {
242- static_assert (std::is_same<T, U>::value, " RefToBase::castTo error non-class element types are not the same" );
243- }
244-
245- // Convert the pointer types, use dynamic_cast if they are classes
246- template <typename T, typename OUT>
247- typename std::enable_if<std::is_class<T>::value, OUT const *>::type convertTo (T const * t) {
248- return dynamic_cast <OUT const *>(t);
249- }
250-
251- template <typename T, typename OUT>
252- typename std::enable_if<!std::is_class<T>::value, OUT const *>::type convertTo (T const * t) {
253- return t;
254- }
255- } // namespace
256-
257236 template <class T >
258237 template <class REF >
238+ requires requires {
239+ typename REF::value_type;
240+ requires std::is_same_v<T, typename REF::value_type> or std::is_base_of_v<T, typename REF::value_type> or
241+ std::is_base_of_v<typename REF::value_type, T>;
242+ }
259243 REF RefToBase<T>::castTo() const {
260244 if (!holder_) {
261245 Exception::throwThis (errors::InvalidReference,
262246 " attempting to cast a null RefToBase;\n "
263247 " You should check for nullity before casting." );
264248 }
265249
266- checkTypeCompatibility<T, typename REF::value_type>();
267-
268250 // If REF is type edm::Ref<C,T,F>, then it is impossible to
269251 // check the container type C here. We just have to assume
270252 // that the caller provided the correct type.
@@ -278,7 +260,12 @@ namespace edm {
278260 if (value == nullptr ) {
279261 return REF (id ());
280262 }
281- typename REF::value_type const * newValue = convertTo<T, typename REF::value_type>(value);
263+ typename REF::value_type const * newValue;
264+ if constexpr (std::is_same_v<T, typename REF::value_type> or std::is_base_of_v<typename REF::value_type, T>) {
265+ newValue = value;
266+ } else {
267+ newValue = dynamic_cast <typename REF::value_type const *>(value);
268+ }
282269 if (newValue) {
283270 return REF (id (), newValue, key (), isTransient ());
284271 }
0 commit comments