最終更新日時:
が更新

履歴 編集

function
<scoped_allocator>

std::scoped_allocator_adaptor::inner_allocator(C++11)

inner_allocator_type& inner_allocator() noexcept;             // (1)
const inner_allocator_type& inner_allocator() const noexcept; // (2)

概要

内側のアロケータを取得する。

戻り値

内側のアロケータオブジェクトを返す。

このクラスのテンプレートパラメータInnerAlloc...が空の場合は、外側と同じアロケータを内側でも使用するものと見なし、*thisを返す。

#include <iostream>
#include <vector>
#include <string>
#include <scoped_allocator>

// std::allocatorに状態変数を持たせただけのクラス
template <class T>
class MyAlloc : public std::allocator<T> {
  int state_; // 状態

  using BaseType = std::allocator<T>;
  template <class> friend class MyAlloc;
public:
  using BaseType::BaseType;

  MyAlloc(int state = 0)
    : state_(state) {}

  template <class U>
  MyAlloc(const MyAlloc<U>& alloc)
    : state_(alloc.state_) {}

  int getState() const { return state_; }
};

template <class T, class U>
bool operator==(const MyAlloc<T>&, const MyAlloc<U>&)
{ return true; }

template <class T, class U>
bool operator!=(const MyAlloc<T>&, const MyAlloc<U>&)
{ return false; }

template <class T>
using alloc_t = MyAlloc<T>;

// コンテナの要素(Inner)
using string = std::basic_string<
  char,
  std::char_traits<char>,
  alloc_t<char>
>;

// コンテナ(Outer)
template <class T>
using vector = std::vector<
  T,
  std::scoped_allocator_adaptor<alloc_t<T>, alloc_t<typename T::value_type>>
>;

int main()
{
  int outer_state = 5;
  int inner_state = 2;
  vector<string>::allocator_type alloc {
    alloc_t<string>(outer_state), // vector自体のアロケータオブジェクト
    alloc_t<char>(inner_state)    // vectorの全ての要素に使用するアロケータオブジェクト
  };

  // 内側(vectorの全ての要素)のアロケータオブジェクトを取得
  alloc_t<char> inner_alloc = alloc.inner_allocator();
  std::cout << inner_alloc.getState() << std::endl;
}

出力

2

バージョン

言語

  • C++11

処理系