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

履歴 編集

function
<scoped_allocator>

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

outer_allocator_type& outer_allocator() noexcept;             // (1)
const outer_allocator_type& outer_allocator() const noexcept; // (2)

概要

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

戻り値

  • (1) : static_cast<OuterAlloc&>(*this)
  • (2) : static_cast<const OuterAlloc&>(*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<string> outer_alloc = alloc.outer_allocator();
  std::cout << outer_alloc.getState() << std::endl;
}

出力

5

バージョン

言語

  • C++11

処理系