我有類似於integral_constant
的類,它需要參數編譯時間布爾值constexpr。現在我想創建is_signed
這個特性,那應該檢查一下is_integral<T>
的評估結果是否爲true,如果是的話,我會檢查是否爲T(-1) < T(0)
。模板參數列表短路?
會爲任何給定類型或這種特質的工作將它未能就不能用-1和0值來構造類型?換句話說,模板參數列表中的constexpr布爾表達式是否短路?
我有類似於integral_constant
的類,它需要參數編譯時間布爾值constexpr。現在我想創建is_signed
這個特性,那應該檢查一下is_integral<T>
的評估結果是否爲true,如果是的話,我會檢查是否爲T(-1) < T(0)
。模板參數列表短路?
會爲任何給定類型或這種特質的工作將它未能就不能用-1和0值來構造類型?換句話說,模板參數列表中的constexpr布爾表達式是否短路?
它不「短路」,因爲表達式仍然必須是有效的,即使它實際上沒有評估,所以你需要添加一個間接層。
一個可能的解決方案:
namespace details {
// primary template for integrals
template<class T, bool = is_integral<T>::value>
struct is_signed_integral_impl : std::integral_constant<bool, T(-1) < T(0)> {};
// not integral
template<class T>
struct is_signed_integral_impl<T, false> : std::false_type {};
}
template<class T>
struct is_signed_integral : details::is_signed_integral_impl<T> {};
這種延遲的評價是mpl::eval_if
的原因:
template <typename T>
struct check_minus_1
: std::integral_constant<bool, T(-1) < T(0)>
{ };
template <typename T>
struct is_signed
: mpl::eval_if_c<is_integral<T>::value,
check_minus_1<T>,
std::false_type>::type
{ };
check_minus_1
只適用於整數類型,但如果is_integral<T>::value
計算結果爲只會被實例化true
。
你冷總是怎麼看[++的libstdc(https://gcc.gnu.org/libstdc++/)實現['is_signed'(http://en.cppreference.com/w/cpp/types/is_signed)來自[''](http://en.cppreference.com/w/cpp/header/type_traits) –
NathanOliver