N3546 - TransformationTraits Redux
N3655 - TransformationTraits Redux, v2
C++11から入ったType Traitsライブラリですが、enable_if
やconditional
といったメタ関数に、Boostにはある高階メタ関数の経験が反映されていないため、typename
と::type
がメタプログラミングコードに大量に出てきてしまいます。
C++14では、エイリアステンプレートによるType Traitsメタ関数のラッパーを追加することになりました。
たとえば、型T
からconst
修飾を外すメタ関数remove_const
には、remove_const_t
というエイリアステンプレート版が追加されます。
template <class T> using remove_const_t = typename remove_const<T>::type;
エイリアステンプレート版は全て、_t
サフィックスを付ける命名規則の元に追加されます。
これで、型を操作するプログラムが書きやすくなります。
ただし、この提案では、型を操作するコードは書きやすくなっても、型特性を判定するコードは書きやすくなりません。::type
ではなく::value
を返すメタ関数です。
この問題に対処するために、Vicenteさん(Boost.Chrono作者、このproposalの提案者)から、追加の提案が出ています。
RFC: TypeTraits Variables - std-proposals
この提案は、値を返すメタ関数のために、変数テンプレートによるラッパーを用意しよう、という内容になっています。
型T
がconst
修飾されているか判定するis_const
には、is_const_c
という変数テンプレート版を追加することが考えられています。
template <class T> constexpr bool is_const_c = is_const<T>::value;
変数テンプレート版は現在、_c
サフィックスを付けることが考えられていますが、valueを意味する_v
サフィックスにすることや、コンセプトのUpperCamelケースにすることも検討されています。
この提案に対するフィードバックが求められていますので、意見がある人は言っておくといいと思います。
(時期的にC++14に入るかどうかはわかりません。)
この最初の提案が、
その他、コンセプトのライブラリがC++14で入らないのだから、時期尚早じゃないかという意見もあります。