diff --git a/dune/common/typetraits.hh b/dune/common/typetraits.hh index 3740db65f5832fee1cfc4b88aeade78ed78e2734..a5205d2208f617e49f4a8ca5bc09d8a5e9a04ee2 100644 --- a/dune/common/typetraits.hh +++ b/dune/common/typetraits.hh @@ -533,50 +533,35 @@ namespace Dune namespace detail { - /// @internal - /// helper to make void_t work with gcc + /// + /** + * @internal + * @brief Helper to make void_t work with gcc versions prior to gcc 5.0. + * + * This was not a compiler bug, but an accidental omission in the C++11 standard. It is not clearly specified what happens + * with unused template arguments in template aliases. The developers of GCC decided to ignore them, thus making void_t equivalent to void. + * With gcc 5.0 this was changed and the voider-hack is no longer needed. + */ template <class...> struct voider { using type = void; }; - - template <class,class = void> class Real_t; } template <class> struct FieldTraits; - /** - * @brief Is void for all valid input types. - * - * The workhorse for C++11 SFINAE-techniques. - */ + //! Is void for all valid input types. The workhorse for C++11 SFINAE-techniques. template <class... Types> using void_t = typename detail::voider<Types...>::type; - //! Convenient access to Type::field_type. + //! Convenient access to FieldTraits<Type>::field_type. template <class Type> - using field_t = typename Type::field_type; + using field_t = typename FieldTraits<Type>::field_type; - //! Convenient access to Type::real_type, resp. FieldTraits<Type::field_type>::real_type. + //! Convenient access to FieldTraits<Type>::real_type. template <class Type> - using real_t = typename detail::Real_t<Type>::type; - - - namespace detail - { - template <class Type,class> - struct Real_t - { - using type = typename FieldTraits<Type>::real_type; - }; - - template <class Type> - struct Real_t< Type , void_t< field_t<Type> > > - { - using type = typename Real_t< field_t<Type> >::type; - }; - } + using real_t = typename FieldTraits<Type>::real_type; /** @} */ }