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);
みたいにかけると嬉しい。