読者です 読者をやめる 読者になる 読者になる

C++14 エイリアステンプレート版のType Traits

C++

N3546 - TransformationTraits Redux
N3655 - TransformationTraits Redux, v2


C++11から入ったType Traitsライブラリですが、enable_ifconditionalといったメタ関数に、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


この提案は、値を返すメタ関数のために、変数テンプレートによるラッパーを用意しよう、という内容になっています。
Tconst修飾されているか判定する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で入らないのだから、時期尚早じゃないかという意見もあります。