![](/img/trans.png)
[英]Template specialisation with enable_if and is_arithmetic for a class
[英]Template enable_if for arithmetic AND complex numbers
我有以下適用於 int、float、double 的模板語句:
template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type > struct Matrix
{
//...
};
我想擴展它以涵蓋復數。 我如何為此添加/更改上述內容。 還是我會矯枉過正,應該只使用香草模板?
[編輯 - 基於 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
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
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.