最終更新日時:
が更新

履歴 編集

class template
<type_traits>

std::aligned_union(C++11)

namespace std {
  template <std::size_t Len,
            class... Types>
  struct aligned_union {
    using type = ;
    static constexpr std::size_t alignment_value = ;
  };

  template <std::size_t Len, class... Types>
  using aligned_union_t = typename aligned_union<Len,Types...>::type; // C++14
}

概要

アライメント調整された共用体領域を作る。

要件

Types...に、1個以上の型が与えられること。

効果

  • aligned_unionは、領域サイズLen、要素型列Types...で調整した未初期化の共用体領域をメンバ型typeとして定義する。
  • Types...のいずれかの型が非POD型だとしても、メンバ型typeはPOD型となる(参照:is_pod)。

また、Types...全ての厳格なアライメント値を、std::size_t型の静的メンバ定数alignment_valueとして定義する。

#include <iostream>
#include <string>
#include <type_traits>

union X {
  int n;
  std::string s;

  X(const char* str)
    : s(str) {}
};

int main()
{
  using aligned_X = std::aligned_union<sizeof(X), int, std::string>;

  aligned_X::type x;

  new (&x) X("hello");

  std::cout << reinterpret_cast<X&>(x).s << std::endl;
  std::cout << aligned_X::alignment_value << std::endl;
}

出力例(アライメント値は処理系定義)

hello
8

バージョン

言語

  • C++11

処理系

  • Clang: 3.3
  • GCC, C++11 mode: 5.0
  • Visual C++: 9.0 (std::tr1), 10.0, 11.0, 12.0, 14.0
    • 11.0は、alignment_valueが定義されていない。
    • 11.0は、可変引数テンプレートに対応していないため、不完全な実装である。
    • aligned_union_tは12.0から

参照