Namaran

Code daily. Without assist.

2026-09-13

print_pairs.cpp

#include <iostream>

void print_pairs() {
    std::cout << '\n';
}

template <class K, class V, class... Rest>
void print_pairs(const K& key, const V& value, const Rest&... rest) {
    std::cout << key << '=' << value << ';';
    print_pairs(rest...);
}

int main() {
    print_pairs("x", 1, "y", 2.5);
}

これは何を出力するでしょうか? また、mainprint_pairs("a", 1, "b");を1行足すとどうなるでしょうか?

Answer

出力はx=1;y=2.5;(その後に改行)です。テンプレート版は引数を2つずつ剥がして残りのrest...で自分を呼び、引数が尽きたところで非テンプレートのprint_pairs()が選ばれて改行を出します。ただしこの「再帰」は実行時に同じ関数へ戻っているのではなく、print_pairs<char[2], int, char[2], double>print_pairs<char[2], double>print_pairs()という引数の型が違う別々の関数を、コンパイラが展開して作ったものです。

print_pairs("a", 1, "b")を足すとコンパイルエラーになります。2つ剥がした後のprint_pairs("b")は、0引数の版にも2引数以上の版にも合わないからです。引数が奇数個という誤りを、専用のチェックを書かずに再帰の形そのものがコンパイル時に弾いてくれます。