ホームに戻る
出典 :
関連 :
目次 :
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 は継承コンストラクタの宣言にも用いる。詳細は委譲コンストラクタと継承コンストラクタを参照。