C++ で特定の型での可変長引数を受け取る

例えば『int 型の可変長引数』みたいな感じで受け取るコードを考えてみた。

[std::initializer_list を使う]

std::initializer_list<int> で受け取ります。


void
print(std::initializer_list<int> xs){
    for(auto&& x : xs){
        std::cout << x << std::endl;
    }
}

print({1, 2, 3, 4, 5});

関数の定義はすっきりするんですが、呼び出し側で {} をつける必要があるのがもにょる。

[可変長テンプレート引数を使う]

可変長テンプレート引数を使うを使います。

template<typename... Args>
auto
print(Args... xs)
-> decltype(std::initializer_list<int>{xs...}, std::declval<void>()) {
    for(auto&& x : { xs... }){
        std::cout << x << std::endl;
    }
}

print(1, 2, 3, 4, 5);

こっちは呼び出し側はすっきりするんですが、実装側はちょっと手間なのが欠点。 個人的には、

void
print(int... xs){
    for(auto&& x : { xs... }){
        std::cout << x << std::endl;
    }
}

print(1, 2, 3, 4, 5);

みたいにかけると嬉しい。