簡體   English   中英

算術與復數的模板 enable_if

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM