C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のユーザー定義リテラル(UDL)とは?基本概念と実装例をわかりやすく解説

本記事では、C++におけるユーザー定義リテラル(User Defined Literals:UDL)の概念について解説します。ユーザー定義リテラルは、C++11から導入された機能です。C++にはもともと組み込み型向けにさまざまなリテラルが用意されていますが、その表現力には限界があります。

C++の組み込みリテラルの例

  • 31(整数)

  • 3.5(double型)

  • 4.2F(float型)

  • 'p'(文字)

  • 31ULL(unsigned long long型)

  • 0xD0(16進数の符号なし整数)

  • "pq"(文字列)

なぜユーザー定義リテラルが必要なのか

組み込みリテラルだけでは不十分なケースがあります。たとえば、重量を表す変数を定義したい場合を考えてみましょう。

long double Weight = 3.5;

このコードを見ても、単位がポンドなのか、キログラムなのか、グラムなのかまったく分かりません。そこでUDLを使うと、値に単位を付けて記述できるようになります。

weight = 5.6kg;
ratio = 5.6kg / 2.1lb;

上記のような比率計算では、通常、両者を同じ単位に変換する必要があります。しかしUDLを活用すれば、単位変換のコストをコンパイル時に処理できます。

ユーザー定義リテラルのメリット

  • 可読性の向上: 値に単位が明示されるため、コードの意図が一目で分かります。

  • コンパイル時変換のサポート: 単位変換などの計算を実行時ではなくコンパイル時に行えます。

  • 高速な実行: 計算をコンパイル時に移すことで、実行時のオーバーヘッドを削減できます。

UDLはコーディング時間を大幅に短縮するものではありませんが、より多くの計算をコンパイル時に移行できるため、プログラムの実行速度向上に貢献します。ユーザー定義型に対してはユーザー定義リテラルを、組み込み型に対しては新しい形式のリテラルを定義できます。

実装例

以下のコードは、バイト・キロバイト・メガバイトを扱うユーザー定義リテラルの実装例です。operator"" を使って、_kb_b_mb というサフィックスを定義しています。

#include<iostream>
#include<iomanip>
using namespace std;

unsigned long long int operator"" _kb( unsigned long long int x ) {
    return x*1024;
}

unsigned long long int operator"" _b( unsigned long long int x ) {
    return x;
}

unsigned long long int operator"" _mb( unsigned long long int x ) {
    return x * 1024 * 1024;
}

int main() {
    unsigned long long int size = 24_kb;
    cout << "Size:" << size << endl;
    cout << "Few more MB:" << ( size + 2_mb ) << endl;
    cout << "Size Div:" <<( 10_kb / 2_kb ) << endl;
    cout << "1KB = " <<( 8_b * 128_b ) << endl;
    return 0;
}

出力結果

Size:24576
Few more MB:2121728
Size Div:5
1KB = 1024

このように、24_kb は自動的に24576(24×1024)へ、2_mb は2097152(2×1024×1024)へと変換され、直感的で読みやすいコードを実現できます。単位やスケールを持つ値を頻繁に扱うプログラムでは、ユーザー定義リテラルが非常に有効な手段となるでしょう。

  1. C++のトークン・識別子・キーワードとは?基本をわかりやすく解説

    C++プログラムを構成する最小単位である「トークン」、開発者が自由に名前を付けられる「識別子」、そして言語側で使用が予約されている「キーワード」。本記事では、C++を学ぶ上で欠かせないこれら三つの概念について、初心者にもわかりやすく丁寧に解説します。トークンとは何かトークン(字句)とは、C++プログラムを構成する要素の中で、コンパイラにとって意味を持つ最小の単位のことです。C++のパーサー(構文解析器)は、ソースコードを読み込みながら、これらのトークンを一つずつ認識していきます。C++のパーサーが認識する主なトークンの種類は以下の通りです。識別子(identifier):変数名や関数名など、ユ

  2. C++のトークンとは?意味と種類をわかりやすく解説

    C++プログラミングにおける「トークン(token)」とは、コンパイラにとって意味を持つ、プログラムを構成する最小の要素のことです。C++のソースコードは、コンパイルの過程でこのトークン単位に分解され、解析されます。 トークンの基本的な役割 トークンは、人間が文章を「単語」の集まりとして読むように、C++のソースコードを意味のある最小単位に分割したものです。これらのトークンが連なったものが「翻訳単位(translation unit)」となり、コンパイラはこの単位をもとにプログラムを解析・変換していきます。通常、トークン同士は空白文字(ホワイトスペース)で区切られます。 C++の主なトーク