【一人 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 はめちゃくちゃな量を書いていたので書く必要がなくなるのはだいぶありがたいですねー。

サポートコンパイラ

参照