【C++】関数の可変長引数を実現する方法


可変長引数テンプレート

もっとも一般的な方法です。

// ①
template<typename First>
int sum(First first) {
  return first;
}

// ②
template<typename First, typename... Rest>
int sum(First first, Rest... rest) {
  return first + sum(rest...);
}
int main() {
  int v = sum(1, 2, 3);
  std::cout << v; // 6
}

可変長テンプレートの仕組みによって、内部的には以下ような展開が行われることになります。

int sum(int a) { reutrn a; }
int sum(int a, int b) { reutrn a + sum(b); }
int sum(int a, int b, int c) { reutrn a + sum(b, c); }

int main() {
  int v = sum(1, 2, 3);
}

初期化リスト

若干趣旨が異なりますが、初期化リストを用いた方法もあります。

int sum(std::initializer_list<int> list) {
  int sum = 0;
  for (auto i : list) sum += i;
  return sum;
}
void test() {
  int v = sum({1, 2, 3});
  std::cout << v; // 6
}

コードの役割を明確化したり、可読性を高めたりするための用途として活用するのもよいかもしれません。

return contains(extention, {"cpp", "cc", "cp"});

広告

関連するオススメの記事