最終更新日時(UTC):
が更新

履歴 編集

<stack>

std::stack::推論補助(C++17)

namespace std {
  // 説明用の型
  template <class InputIterator>
  using iter_val_t = typename iterator_traits<InputIterator>::value_type;

  template <class Container>
  stack(Container)
    -> stack<typename Container::value_type, Container>;      // (1)

  template <class InputIterator>
  stack(InputIterator, InputIterator)
    -> stack<iter_val_t<InputIterator>>;                      // (2) C++23から

  template <ranges::input_range R>
  stack(from_range_t, R&&)-> stack<ranges::range_value_t<R>>; // (3) C++23から

  template <class Container, class Allocator>
  stack(Container, Allocator)
    -> stack<typename Container::value_type, Container>;      // (4)

  template <class InputIterator, class Allocator>
  stack(InputIterator, InputIterator, Allocator)
    -> stack<iter_val_t<InputIterator>, deque<iter_val_t<InputIterator>,
             Allocator>>;                                     // (5) C++23から

  template <ranges::input_range R, class Allocator>
  stack(from_range_t, R&&, Allocator)
    -> stack<ranges::range_value_t<R>, deque<ranges::range_value_t<R>,
             Allocator>>;                                     // (6) C++23から
}

概要

std::stackクラステンプレートの型推論補助。

  • (1) : 元となるコンテナから推論する。
  • (2) : イテレータ範囲から推論する。
  • (3) : Rangeからの推論する。
  • (4) : 元となるコンテナとアロケータから推論する。
  • (5) : イテレータ範囲とアロケータから推論する。
  • (6) : Rangeとアロケータからの推論する。

#include <iostream>
#include <stack>
#include <type_traits>

int main()
{
  std::deque d = {1, 2, 3};

  // 元となるコンテナから推論
  std::stack st {d};
  static_assert(std::is_same_v<
    decltype(st),
    std::stack<int>
  >);

  while (!st.empty()) {
    std::cout << st.top() << std::endl;
    st.pop();
  }
}

出力

3
2
1

バージョン

言語

  • C++17

処理系

関連項目

参照