準備
c++ の型エイリアスには、using キーワードを使用する。
size_tの型エイリアス
using Count = std::size_t;
functionの型エイリアス
using Callback = std::function<void()>;
vectorの型エイリアス
また、エイリアス対象の型がテンプレートの場合、エイリアステンプレートを使用する。
template< typename T >
using MyVector = std::vector<T>;
型エイリアスと関数宣言
簡潔な関数宣言について考える。
uint32_t attack( const uint8_t& strength, const uint8_t& rate );
この関数は 2つの uint8_t を引数として、uint32_t の値を返す。引数には strength と rate という名前が付けられている。
関数宣言において、引数はその型情報さえあればよい。先の関数宣言を簡潔な形にすると、次のようになる。
uint32_t attack( const uint8_t&, const uint8_t& );
引数の型名によって、この関数が返す値の意味(ダメージ値か何かだろうか?)をなんとなく推測できていたが、こうなってしまっては推測はおろか、最早何をしたいのかわからない。
そこで、型エイリアスを使って、この関数宣言の真意を伝えよう。
using Damage = uint32_t;
using Strength = uint8_t;
using Rate = uint8_t;
関数宣言を見直す。
Damage attack( const Strength&, const Rate& );
引数名を添える必要なく、必要な全ての引数情報を詰め込んだ。また、返値の意味もわかりやすくなっている。関数宣言が簡潔となれば、誤った順で引数を与えてしまうことや、違う型で返値を受けてしまうミスを減らせるため、caller にとっても有益となる。
関数宣言はメッセージ
規模が小さく、自分ひとりで設計が完結するプログラムの場合には、あまり気にすることはないかもしれない。しかし、幾度も説明や修正が必要なモジュール設計、特にAPI であればクリティカルな問題となり得るだろう。今回は型エイリアスを活用することで、プログラムコードが曖昧になりがちな部分の対策を紹介した。コメントがなくともすらすらと理解のできるプログラムコードほど、プログラマにとって優しいメッセージはないと思う。