std::is_signed<T>
とstd::numeric_limits<T>::is_signed
の両方は、T
の署名度についての回答を返すと想定されています。
なぜ今あるのですか2つの(つまりC++ 11以降)の標識がありますか?std :: is_signedの相違点<T>とstd :: numeric_limits <T> :: is_signed?
答えて
std::numeric_limits<T>
がユーザー定義型に特化している場合にのみ唯一の違いがあると思われます。そのようなユーザー定義の型はもちろん、is_signed
の独自の値を提供できます。しかし、このタイプのstd::is_signed<T>::value
を求めるのは、std::is_signed<T>
が独立して専門化されていない限り、常にfalse
を返します。
std::is_signed<T>
が表すという条件が
is_arithmetic<T>::value && T(-1) < T(0)
更新であるかのように思え:常に-知力ハワードヒナントpoints outstd::numeric_limits<>
が合法的に、専門的なことができますが、<type_traits>
で何もに許可されていないこと特に明記しない限り特殊化し、is_signed
は特化可能であると指定されていません。
(それが特化されていた場合)そのため、std::numeric_limits<T>::is_signed
はユーザー定義型のためtrue
を返すことがありますがstd::is_signed<T>::value
は常にユーザー定義型のためfalse
を返します。
' std :: numeric_limits
@DavidHammen:いいえ、制限はありますが、専門分野には適用されません。 'std'で既存のテンプレートを特殊化することは許されています。自分のものを追加することはできません。 –
@DavidHammen:クラステンプレートやオーバーロード関数/関数テンプレートを部分的に特殊化しないために、名前空間 'std'のテンプレートを完全に特殊化することは常に正当です。 – ildjarn
'std :: is_signed'は型ですが、 'std :: numeric_limits :: is_signed'メンバは単なる値です。メタプログラミングでは、前者を持つ方がはるかに便利であり、より一貫性があります。 –
Xeo
実際には 'std :: is_signed :: value'を実際に使用します。 'std :: is_signed 'をどこで直接使用しますか? –
しかし、それらの結果は今までと異なるのでしょうか? – smilingthax