:dep typenum
//above line is magic for adding crate
use typenum::*;
type A = Sum<P1, P2>; // A is P3
assert_eq!(A::to_i32(), 3); // A::to_i32() == 3
型レベル整数ライブラリtypenumの紹介
Rust
はじめに
型レベル整数とは,型によって整数を表現する方法です.この型とは整数を表すi32
や文字列を表すString
と同様のものです.すなわち,1を表す型や,2を表す型を定義し,それらによって整数を型レベルで表現します.
型レベル整数の嬉しい点として,型レベル整数による式はコンパイル時に評価されることが挙げられます.これによって,各種定数を容易に設定することが可能となります.
Rustにて型レベル整数の実装として,typenumというクレートがあります.ここでは,このtypenumの簡単な使用方法を紹介します.
やったこと
- typenumによる型レベル整数の定義
- typenumによってサポートされる演算の評価
実際に型レベル整数を使ってみる
それでは,実際にtypenumを使用して整数の演算を行っていきます.まず,1+2
を計算する例を以下に示します. ここで,P1
とP2
はそれぞれ1
と2
を,Sum
は加算を表します.また,to_i32()
は型レベル整数が示す値をi32
へ変換する処理です.
以上の結果より,適切に型レベルで1+2
が計算出来たことがわかります. 次はもう少し複雑な例について考えます.以下に示すコードは,型レベル整数を用いて,((1 + 2 ) * 3 - 4) / 5
を計算します.ここで,Quot
は除算を,Diff
は減算を,Prod
は乗算を表します.
use typenum::*;
type A = Quot<Diff<Prod<Sum<P1, P2>, P3>, P4>, P5>; // A is P1
assert_eq!(A::to_i32(), 1); // A::to_i32() == 1
ここでは,最低限の演算しか紹介しませんでしたが,typenumにはこれら以外にも多くの機能が実装されています.興味のある方は,是非確認してみてください.
参考
[1]