typedefされた型の取り得る値の取得方法(std::numeric_limits)

ちょっと前に作ってたソフトでtypedefされた型の取り得る最大値、最小値の取得方法がわからなくて困ったのでメモ


例えばint型が取り得る値の最大値、最小値が知りたい場合、C言語的に書くとINT_MAX,INT_MINを参照するのが普通なんだけど
OpenGLで定義されてるようなGLuintとかtypedefされた型の取り得る値の範囲がほしい場合
GLuint_MAX,GLuint_MINのような便利な物が定義されていないので、
どうやって取り得る値の範囲を取得しようかという話
自分でヘッダーを見に行ってなんの型の別名としてtypedefされているかを確認して
INT_MAXなどのマクロを使う方法もあるけれど、
これだとわざわざ環境に依存しないためにtypedefしてる意味が無くなってしまう。
ということで調べてみるとC++の標準ライブラリにnumeric_limitsなるものを発見


こんな感じ

#include <iostream>
#include <limits>
#include <GL/glut.h>
int main()
{
	std::cout << std::numeric_limits<GLuint>::max() << std::endl;
	std::cout << std::numeric_limits<double>::max();

	return 0;
}

出力
4294967295
1.79769e+308


以前のようにINT_MAXとかのプリプロセッサではなくて
テンプレートを使って取得できるのでtypedefされていてもコンパイル時にきちんと評価されて値が返ってくるというわけ


ちなみに実装は単純に各型に関して特殊化したテンプレートが用意してあって
numeric_limits::max(){return INT_MAX;}
みたいにしてるだけみたい


どうでもいい話だけどdouble型の最大値用のDBL_MAXなんてマクロが定義されているのをnumeric_limitsの実装を見て初めて知った
#include
でその他浮動小数点関係のマクロがいろいろ定義されているらしい