【一人 C++20 Advent Calendar 2019】型名であることが明らかな文脈で typename を省略可能になる【5日目】
一人 C++20 Advent Calendar 2019 5日目の記事になります。
型名であることが明らかな文脈で typename を省略可能になる
C++ では依存名を解決する為に以下のようなケースで typename
を付ける必要がありました。
template<typename T> typename T::value_type const& first(T const& xs) { return xs[0]; } template< typename T, typename value_type = typename T::value_type > void insert(T& xs, value_type const& x) { xs.push_back(x); } template<typename T> using vt = typename T::value_type;
これが C++20 では緩和されて型名しか書けない文脈では typename
を省略して書くことが出来るようになりました。
#include <iostream> #include <vector> template<typename T> T::value_type const& // OK : 省略可能 first(T const& xs) { return xs[0]; } template< typename T, typename value_type = T::value_type // OK : 省略可能 > void insert(T& xs, value_type const& x) { xs.push_back(x); } template<typename T> using vt = T::value_type; // OK : 省略可能 int main(){ auto xs = std::vector{ 1, 2, 3 }; std::cout << first(xs) << std::endl; insert(xs, 4); for(vt<decltype(xs)> x : xs) { std::cout << x << std::endl; } return 0; } /* output: 1 1 2 3 4 */
C++17 でもいくつかの文脈で typename
が省略可能になっていたのですが、 C++20 では更にそれが緩和された形になりますね。
詳しくは以下を参照して下さい。
今まで typename
はめちゃくちゃな量を書いていたので書く必要がなくなるのはだいぶありがたいですねー。
サポートコンパイラ
- GCC 9