最終更新日時(UTC): 2025年07月14日 14時04分00秒
Koichi Murase が更新

履歴 編集

<unordered_set>

# std::unordered_multiset::推論補助(C++17)

    namespace std {
      template <class InputIterator,
                class Hash = hash<typename iterator_traits<InputIterator>::value_type>,
                class Pred = equal_to<typename iterator_traits<InputIterator>::value_type>,
                class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
      unordered_multiset(InputIterator, InputIterator, see below::size_type = see below,
                         Hash = Hash(), Pred = Pred(), Allocator = Allocator())
        -> unordered_multiset<typename iterator_traits<InputIterator>::value_type,
                              Hash, Pred, Allocator>;    // (1)

      template <class T, class Hash = hash<T>,
                class Pred = equal_to<T>, class Allocator = allocator<T>>
      unordered_multiset(initializer_list<T>, typename see below::size_type = see below,
                         Hash = Hash(), Pred = Pred(), Allocator = Allocator())
        -> unordered_multiset<T, Hash, Pred, Allocator>; // (2)

      template <class InputIterator,  class Allocator>
      unordered_multiset(InputIterator, InputIterator, typename see below::size_type, Allocator)
        -> unordered_multiset<typename iterator_traits<InputIterator>::value_type,
                              hash<typename iterator_traits<InputIterator>::value_type>,
                              equal_to<typename iterator_traits<InputIterator>::value_type>,
                              Allocator>;                // (3)

      template <class InputIterator,  class Hash, class Allocator>
      unordered_multiset(InputIterator, InputIterator, typename see below::size_type,
                         Hash, Allocator)
        -> unordered_multiset<
                 typename iterator_traits<InputIterator>::value_type,
                 Hash,
                 equal_to<typename iterator_traits<InputIterator>::value_type>,
                 Allocator>;                             // (4)

      template <class T, class Allocator>
      unordered_multiset(initializer_list<T>, typename see below::size_type, Allocator)
        -> unordered_multiset<T, hash<T>,
                              equal_to<T>, Allocator>;   // (5)

      template <class T, class Hash, class Allocator>
      unordered_multiset(initializer_list<T>, typename see below::size_type, Hash, Allocator)
        -> unordered_multiset<T, Hash,
                              equal_to<T>, Allocator>;   // (6)

      template <ranges::input_range R,
               class Hash = hash<ranges::range_value_t<R>>,
               class Pred = equal_to<ranges::range_value_t<R>>,
               class Allocator = allocator<ranges::range_value_t<R>>>
      unordered_multiset(from_range_t, R&&, typename see below::size_type = see below,
                         Hash = Hash(), Pred = Pred(), Allocator = Allocator())
        -> unordered_multiset<ranges::range_value_t<R>, Hash, Pred, Allocator>; // (7) C++23から

      template <ranges::input_range R, class Allocator>
      unordered_multiset(from_range_t, R&&, typename see below::size_type, Allocator)
        -> unordered_multiset<ranges::range_value_t<R>, hash<ranges::range_value_t<R>>,
                              equal_to<ranges::range_value_t<R>>, Allocator>;   // (8) C++23から

      template <ranges::input_range R, class Allocator>
      unordered_multiset(from_range_t, R&&, Allocator)
        -> unordered_multiset<ranges::range_value_t<R>, hash<ranges::range_value_t<R>>,
                              equal_to<ranges::range_value_t<R>>, Allocator>;   // (9) C++23から

      template <ranges::input_range R, class Hash, class Allocator>
      unordered_multiset(from_range_t, R&&, typename see below::size_type, Hash, Allocator)
        -> unordered_multiset<ranges::range_value_t<R>, Hash,
                              equal_to<ranges::range_value_t<R>>, Allocator>;   // (10) C++23から
    }

## 概要

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

- (1) : イテレータ範囲からの推論
- (2) : 初期化子リストからの推論
- (3) : イテレータ範囲とアロケータからの推論
- (4) : イテレータ範囲、ハッシュ関数、アロケータからの推論
- (5) : 初期化子リストとアロケータからの推論
- (6) : 初期化子リスト、ハッシュ関数、アロケータからの推論
- (7) : Rangeからの推論
- (8) : Rangeとアロケータからの推論
- (9) : Rangeとハッシュ関数からの推論
- (10) : Range、ハッシュ関数、アロケータからの推論

## 備考

- メンバ型`size_type`は自動的に推論される

## 例

    #include <unordered_set>
    #include <type_traits>
    #include <cassert>

    int main()
    {
      // (2)
      // 初期化子リストから推論
      std::unordered_multiset ums1 = {1, 2, 3};
      static_assert(std::is_same_v<decltype(ums1), std::unordered_multiset<int>>);

      // パラメータ設定済みのsetからの推論
      std::unordered_multiset ums2 = ums1;
      static_assert(std::is_same_v<decltype(ums2), std::unordered_multiset<int>>);

      // (1)
      // イテレータ範囲からの推論。
      // ums3{ums1.begin(), ums1.end()} とすると、イテレータの初期化子リストと見なされてしまうので注意
      std::unordered_multiset ums3(ums1.begin(), ums1.end());
      static_assert(std::is_same_v<decltype(ums3), std::unordered_multiset<int>>);
      assert(ums3.size() == 3);
    }

### 出力

## バージョン

### 言語

- C++17

### 処理系

- Clang:
- GCC:
- Visual C++: ??

## 関連項目

- C++17 クラステンプレートのテンプレート引数推論

## 参照

- P0433R2 Toward a resolution of US7 and US14: Integrating template deduction for class templates into the standard library