用于算术和复数的模板 enable_if
Template enable_if for arithmetic AND complex numbers
我有以下适用于整数、浮点数、双精度数的模板语句:
template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type > struct Matrix
{
//...
};
我想扩展它以涵盖复数。我如何 add/change 以上内容。还是我要矫枉过正,应该只使用香草模板?
[编辑 - 基于 HolyBlackCat 的回答]
这有效:
template<typename T> concept bool IsNmberOrComplex() { return (std::is_convertible<T, double>::value || std::is_convertible<T, std::complex<decltype(T())>>::value); }
template<IsNmberOrComplex T> struct Matrix
根据 HolyBlackCat,这不是正确的 c++20。如果您能提供这样的答案,请提供。
template <template <typename...> typename T, typename U>
inline constexpr bool is_specialization_of_v = false;
template <template <typename...> typename T, typename ...P>
inline constexpr bool is_specialization_of_v<T, T<P...>> = true;
然后is_specialization_of_v<std::complex, T>
会告诉你T
是不是std::complex<...>
。
请注意,class 模板上的这种 SFINAE 并不是最好的主意,因为可以通过传递自定义模板参数轻松禁用它。考虑使用 C++20 中的 requires
(如果可以使用 C++20,is_specialization_of_v
可以变成 concept
)。
我有以下适用于整数、浮点数、双精度数的模板语句:
template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type > struct Matrix
{
//...
};
我想扩展它以涵盖复数。我如何 add/change 以上内容。还是我要矫枉过正,应该只使用香草模板?
[编辑 - 基于 HolyBlackCat 的回答] 这有效:
template<typename T> concept bool IsNmberOrComplex() { return (std::is_convertible<T, double>::value || std::is_convertible<T, std::complex<decltype(T())>>::value); }
template<IsNmberOrComplex T> struct Matrix
根据 HolyBlackCat,这不是正确的 c++20。如果您能提供这样的答案,请提供。
template <template <typename...> typename T, typename U>
inline constexpr bool is_specialization_of_v = false;
template <template <typename...> typename T, typename ...P>
inline constexpr bool is_specialization_of_v<T, T<P...>> = true;
然后is_specialization_of_v<std::complex, T>
会告诉你T
是不是std::complex<...>
。
请注意,class 模板上的这种 SFINAE 并不是最好的主意,因为可以通过传递自定义模板参数轻松禁用它。考虑使用 C++20 中的 requires
(如果可以使用 C++20,is_specialization_of_v
可以变成 concept
)。