最終更新日時:
が更新

履歴 編集

class template
<type_traits>

std::common_type(C++11)

namespace std {
  template <class... Types>
  struct common_type {
    using type = ;
  };

  template <class... T>
  using common_type_t = typename common_type<T...>::type; // C++14
}

概要

変換可能な共通の型を取得する。

要件

Types...の全ての型は完全型であるか、const/volatile修飾された(あるいはされていない)voidでなければならない。

効果

common_typeは、Types...に含まれる全ての型が暗黙変換可能な型を、メンバ型typeとして定義する。

#include <iostream>
#include <type_traits>

// 2つの値どちらが小さいかを返すアルゴリズム
// 型Tと型Uの共通の型を戻り値型にする
template <class T, class U>
typename std::common_type<T, U>::type
  generic_min(T t, U u)
{
  return t < u ? t : u;
}

int main()
{
  auto x = generic_min(3L, 2);

  static_assert(
    std::is_same<decltype(x), long>::value == true,
    "type of x is long");

  std::cout << x << std::endl;
}

出力

2

定義(C++11)

template <class ...T>
struct common_type;

template <class T>
struct common_type<T> {
  using type = T;
};

template <class T, class U>
struct common_type<T, U> {
  using type = decltype(true ? declval<T>() : declval<U>());
};

template <class T, class U, class... V>
struct common_type<T, U, V...> {
  using type = typename common_type<typename common_type<T, U>::type, V...>::type;
};

定義(C++14)

template <class ...T>
struct common_type;

template <class... T>
using common_type_t = typename common_type<T...>::type;

template <class T>
struct common_type<T> {
  using type = decay_t<T>;
};

template <class T, class U>
struct common_type<T, U> {
  using type = decay_t<decltype(true ? declval<T>() : declval<U>())>;
};

template <class T, class U, class... V>
struct common_type<T, U, V...> {
  using type = common_type_t<common_type_t<T, U>, V...>;
};

バージョン

言語

  • C++11

処理系

  • Clang: 3.0
  • GCC, C++11 mode: 4.4.7
  • Visual C++: 10.0, 11.0, 12.0, 14.0
    • 11.0までは、可変引数テンプレートに対応していないため、不完全な実装である。
    • common_type_tは、12.0から。

参照