templateキーワードを複数行書くケース

sprout::tupleの実装などに見られる。ネストされたtemplate関数の実装を書く場合等に使う。あまり見かけないからか、解説されてない気がしたのでメモ程度に残しておきます。複数書く場合は、外側のテンプレートに対応するものから順番に書きます。

template <typename T1, typename T2>
struct pair {};

template <typename... Types>
struct tuple {
    template <typename T1, typename T2>
    tuple(pair<T1, T2>);
};

template <typename... Types> // 複数書ける
template <typename T1, typename T2> // 複数書ける
tuple<Types...>::tuple(pair<T1, T2>) {};

int main() {}