ホームに戻る
出典 :
エイリアステンプレート - cpprefjp C++日本語リファレンス typedef は C++11 ではオワコン - Qiita
関連 :
名前空間(namespace) C++11 C#におけるusing
目次 :

typedef と using (型エイリアス)

C++03(およびC)では、既存の型に別名(エイリアス)を付ける際には typedef を用いていた。
C++11以降では同様に using (型エイリアス)を用いて別名を付与することができる。
typedef は、テンプレートを作ることができないという欠点があるが、using ではこの問題が解消されている。

型エイリアスの類型

基本形

既存の型 oldtype に別名 newtype を付与する場合。
using では = (代入演算子)が必要な点に注意。
typedef typedef oldtype newtype;
using using newtype = oldtype;

関数ポインタ型への別名付与

別名として FuncAlias を付与する場合。
typedef typedef void (*FuncAlias)(double);
using using FuncAlias = void (*)(double);
using は表記が幾分簡潔となる。

テンプレートへの別名付与

typedef では、未知の型をテンプレート引数に含む汎用型に対して別名を付与することができない。
using では可能であり、typedef に対する利点となっている。
// 汎用クラス SomeType1 , SomeType2 宣言 template <typename First, typename Second, int Third> class SomeType1; template <typename Another> class SomeType2; // すべてのテンプレート引数を明示した SomeType に別名付与 (すべて既知の型) typedef SomeType1<KnownType1, KnownType2, 5> TypeAlias; //< typedef による別名付与 ⇒ OK using TypeAlias = SomeType1<KnownType1, KnownType2, 5>; //< using による別名付与 ⇒ OK // テンプレートに別名付与 (Second は未知の型) tenplate <typename Second> typedef SomeType1<KnownType1, Second, 5> TypeAlias; //< typedef による別名付与 ⇒ NG using TypeAlias = SomeType1<KnownType1, Second, 5>; //< using による別名付与 ⇒ OK // テンプレートに別名付与 (Another は未知の型) tenplate <typename Another> typedef SomeType2<Another> TypeAlias; //< typedef による別名付与 ⇒ NG using TypeAlias = SomeType2<Another>; //< using による別名付与 ⇒ OK

名前空間の使用(取り込み)

名前空間を使用する際に using を用いる。詳細は名前空間(namespace)を参照。

継承コンストラクタの宣言

using は継承コンストラクタの宣言にも用いる。詳細は委譲コンストラクタと継承コンストラクタを参照。