// Forward declarations
#ifndef DOXYGEN
-template <typename T>
-struct EnableIfScalar;
template <typename T, typename U>
struct ProductType;
#endif
* @relatesalso ProductType
*/
template <typename T, typename U>
-inline typename ProductType<std::complex<T>, std::complex<U>>::type
+inline typename std::enable_if<
+ std::is_floating_point<T>::value && std::is_floating_point<U>::value,
+ typename ProductType<std::complex<T>, std::complex<U>>::type>::type
operator*(const std::complex<T> &left, const std::complex<U> &right)
{
using result_type =
* @relatesalso ProductType
*/
template <typename T, typename U>
-inline typename ProductType<std::complex<T>, std::complex<U>>::type
+inline typename std::enable_if<
+ std::is_floating_point<T>::value && std::is_floating_point<U>::value,
+ typename ProductType<std::complex<T>, std::complex<U>>::type>::type
operator/(const std::complex<T> &left, const std::complex<U> &right)
{
using result_type =
* floating point type with a different real floating point type. Annoyingly,
* the standard library does not provide such an operator...
*
- * @relatesalso EnableIfScalar
* @relatesalso ProductType
*/
template <typename T, typename U>
inline
- typename ProductType<std::complex<T>, typename EnableIfScalar<U>::type>::type
+ typename std::enable_if<std::is_floating_point<T>::value &&
+ std::is_floating_point<U>::value,
+ typename ProductType<std::complex<T>, U>::type>::type
operator*(const std::complex<T> &left, const U &right)
{
using result_type = typename ProductType<std::complex<T>, U>::type;
* floating point type with a different real floating point type. Annoyingly,
* the standard library does not provide such an operator...
*
- * @relatesalso EnableIfScalar
* @relatesalso ProductType
*/
template <typename T, typename U>
inline
- typename ProductType<std::complex<T>, typename EnableIfScalar<U>::type>::type
+ typename std::enable_if<std::is_floating_point<T>::value &&
+ std::is_floating_point<U>::value,
+ typename ProductType<std::complex<T>, U>::type>::type
operator/(const std::complex<T> &left, const U &right)
{
using result_type = typename ProductType<std::complex<T>, U>::type;
* floating point type with a different complex floating point type.
* Annoyingly, the standard library does not provide such an operator...
*
- * @relatesalso EnableIfScalar
* @relatesalso ProductType
*/
template <typename T, typename U>
-inline
- typename ProductType<typename EnableIfScalar<T>::type, std::complex<U>>::type
+inline typename
+
+ std::enable_if<std::is_floating_point<T>::value &&
+ std::is_floating_point<U>::value,
+ typename ProductType<T, std::complex<U>>::type>::type
operator*(const T &left, const std::complex<U> &right)
{
- using result_type = typename ProductType<std::complex<T>, U>::type;
+ using result_type = typename ProductType<T, std::complex<U>>::type;
return static_cast<result_type>(left) * static_cast<result_type>(right);
}
* floating point type with a different complex floating point type.
* Annoyingly, the standard library does not provide such an operator...
*
- * @relatesalso EnableIfScalar
* @relatesalso ProductType
*/
template <typename T, typename U>
inline
- typename ProductType<typename EnableIfScalar<T>::type, std::complex<U>>::type
+ typename std::enable_if<std::is_floating_point<T>::value &&
+ std::is_floating_point<U>::value,
+ typename ProductType<T, std::complex<U>>::type>::type
operator/(const T &left, const std::complex<U> &right)
{
- using result_type = typename ProductType<std::complex<T>, U>::type;
+ using result_type = typename ProductType<T, std::complex<U>>::type;
return static_cast<result_type>(left) / static_cast<result_type>(right);
}
#endif /* DEAL_II_HAVE_COMPLEX_OPERATOR_OVERLOADS */