@@ -148,15 +148,15 @@ namespace xsimd
148148#endif
149149
150150template <class T ,class Tp >
151- XSIMD_INLINEtypename std::common_type <T, Tp>::type add (Tconst & x, Tpconst & y)noexcept
151+ XSIMD_INLINE std::common_type_t <T, Tp>add (Tconst & x, Tpconst & y)noexcept
152152 {
153153return x + y;
154154 }
155155
156156template <class T ,class Tp >
157- XSIMD_INLINEtypename std::common_type <T, Tp>::type avg (Tconst & x, Tpconst & y)noexcept
157+ XSIMD_INLINE std::common_type_t <T, Tp>avg (Tconst & x, Tpconst & y)noexcept
158158 {
159- using common_type =typename std::common_type <T, Tp>::type ;
159+ using common_type = std::common_type_t <T, Tp>;
160160if (std::is_floating_point<common_type>::value)
161161return (x + y) /2 ;
162162else if (std::is_unsigned<common_type>::value)
@@ -168,16 +168,16 @@ namespace xsimd
168168// Inspired by
169169// https://stackoverflow.com/questions/5697500/take-the-average-of-two-signed-numbers-in-c
170170auto t = (x & y) + ((x ^ y) >>1 );
171- auto t_u =static_cast <typename std::make_unsigned <common_type>::type >(t);
171+ auto t_u =static_cast <std::make_unsigned_t <common_type>>(t);
172172auto avg = t + (static_cast <T>(t_u >> (8 *sizeof (T) -1 )) & (x ^ y));
173173return avg;
174174 }
175175 }
176176
177177template <class T ,class Tp >
178- XSIMD_INLINEtypename std::common_type <T, Tp>::type avgr (Tconst & x, Tpconst & y)noexcept
178+ XSIMD_INLINE std::common_type_t <T, Tp>avgr (Tconst & x, Tpconst & y)noexcept
179179 {
180- using common_type =typename std::common_type <T, Tp>::type ;
180+ using common_type = std::common_type_t <T, Tp>;
181181if (std::is_floating_point<common_type>::value)
182182return avg (x, y);
183183else
@@ -379,7 +379,7 @@ namespace xsimd
379379 }
380380
381381template <class T ,class Tp >
382- XSIMD_INLINEtypename std::common_type <T, Tp>::type div (Tconst & x, Tpconst & y)noexcept
382+ XSIMD_INLINE std::common_type_t <T, Tp>div (Tconst & x, Tpconst & y)noexcept
383383 {
384384return x / y;
385385 }
@@ -391,7 +391,7 @@ namespace xsimd
391391 }
392392
393393template <class T ,class Tp >
394- XSIMD_INLINEtypename std::common_type <T, Tp>::type mul (Tconst & x, Tpconst & y)noexcept
394+ XSIMD_INLINE std::common_type_t <T, Tp>mul (Tconst & x, Tpconst & y)noexcept
395395 {
396396return x * y;
397397 }
@@ -880,7 +880,7 @@ namespace xsimd
880880 }
881881
882882template <class T ,class Tp >
883- XSIMD_INLINEtypename std::common_type <T, Tp>::type sub (Tconst & x, Tpconst & y)noexcept
883+ XSIMD_INLINE std::common_type_t <T, Tp>sub (Tconst & x, Tpconst & y)noexcept
884884 {
885885return x - y;
886886 }
@@ -921,7 +921,7 @@ namespace xsimd
921921
922922// numpy defines minimum operator on complex using lexical comparison
923923template <class T0 ,class T1 >
924- XSIMD_INLINE std::complex <typename std::common_type <T0, T1>::type >
924+ XSIMD_INLINE std::complex <std::common_type_t <T0, T1>>
925925min (std::complex <T0>const & self, std::complex <T1>const & other)noexcept
926926 {
927927return (self.real () < other.real ()) ? (self) : (self.real () == other.real () ? (self.imag () < other.imag () ? self : other) : other);
@@ -935,7 +935,7 @@ namespace xsimd
935935
936936// numpy defines maximum operator on complex using lexical comparison
937937template <class T0 ,class T1 >
938- XSIMD_INLINE std::complex <typename std::common_type <T0, T1>::type >
938+ XSIMD_INLINE std::complex <std::common_type_t <T0, T1>>
939939max (std::complex <T0>const & self, std::complex <T1>const & other)noexcept
940940 {
941941return (self.real () > other.real ()) ? (self) : (self.real () == other.real () ? (self.imag () > other.imag () ? self : other) : other);