用于算术和复数的模板 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)。