What is it, naokirin?

C++0xの機能 (ユーザー定義リテラル)

今回は"User-defined literals"(ユーザー定義リテラル)。

これって使い道あるの?とか言う疑問、質問は受け付けないのであしからず。(私はとりあえず使い道は今のところこれと言ってない)

さて、ユーザー定義リテラルとは何か。

読んで字のごとく「ユーザーが定義できるリテラル」のことです。

もっと詳しく言うと、基本的には「ユーザーが定義できるリテラル修飾子」のことです。

リテラル修飾子とはいわゆる定数の浮動小数点数(たとえば、"1.3")が基本的にdouble型として扱われるのに対して、"1.3f"とした場合はfloat型として扱われるといったときに用いられる"f"のようなもののことです。


そしてもう一つ、説明時に必要なことを説明します。
リテラルには「rawリテラル」と「cookedリテラル」なるものが存在する(らしい。私は知識不足で知りませんでした)。

たとえば 123 というリテラルがあったとすると、rawリテラルとしては'1','2','3'という文字の並びであり、cookedリテラルとしては 123 という整数値になります。

そして、文字列のリテラルを除くと全てのリテラルはこのどちらにも拡張できます。


ここからユーザー定義リテラルについて。

ユーザー定義リテラルでは、rawリテラルは次のようなコードで定義して使用することができます。ただし、リテラル修飾子として定義できるのは"_"で始まるものだけです。(C++では"_"で始まらないものは予約されているらしい)

OutputType operator""_suffix(const char* literal);

/* operator""_suffix("123")と同じ */
OutputType x = 123_suffix;


また、可変長引数テンプレートを用いることもできます。(これもちなみにC++0x)

template <char...> OutputType operator""_suffix();

OutputType x = 123_suffix;



またcookedリテラルではテンプレート形式のものはありません。また引数がcooked形式の型となることに注意してください。

OutputType operator""_suffix(int literal);

OutputType x = 123_suffix;



この記事を書いている間にユーザー定義リテラルの使い道について考えてみたけれど、2進数を表す数値とかをリテラルで表したいときとかにはいいのかな。そのくらいしか使い道が思いつかない・・・