同様の質問: constexpr ではなく、特殊なテンプレート構造体で実装されるのはなぜですか?
type_traits
–しかし、別の答えがあります。
エイリアス テンプレートは特殊化できないため、現在、型特性を直接実装するために使用できないことを認識しています1。ただし、これは委員会の意識的な決定であり、私が見る限り、これを禁止する技術的な理由はありません。
では、型特性をエイリアス テンプレートとして実装し、構文を簡素化する方が理にかなっているのではないでしょうか?
検討
typename enable_if<is_pointer<T>::value, size_t>::type
address(T p);
対
enable_if<is_pointer<T>, size_t> address(T p);
もちろん、これによりBoost.TypeTraitsから移行する際にインターフェースの破壊的な変更が発生しますが、これは本当に大きな問題なのでしょうか?
結局のところ、型が異なる名前空間に存在するため、コードを変更する必要があり、多くの現代の C++ プログラマーは名前空間を開くことに消極的であるため、明示的に修飾されます (変更される場合)。
一方で、コードは大幅に簡素化されます。また、テンプレートのメタプログラミングがしばしば深くネストされ、複雑で複雑になることを考えると、より明確なインターフェイスが有益であることは明らかです。
何か不足していますか?そうでない場合は、単なる当て推量ではなく、委員会の決定の根拠に関する知識に基づいた (そして引用できる) 回答をいただければ幸いです。
1しかし、間接的には非常にうまくいっています! 検討:
template <typename T> using is_pointer = typename meta::is_pointer<T>::type;
現在のタイプmeta::is_pointer<T>
に対応する場所。std::is_pointer<T>