type2int
コンパイル時点で型を数値化する記述を無理やり作ってみた。VC++2008だとうまくいった。他のコンパイラだとどうかな。。
#include "stdint.h" #include <stddef.h> #include <stdlib.h> #include <stdio.h> #define ref_member(type, member) (&((type*)0)->member) #define member_sizeof(type, member) sizeof(((type*)0)->member) typedef struct { uint16_t a; int16_t b; } Mugi; typedef enum { Hoge_A, Hoge_B, } Hoge; typedef struct { uint8_t a; int32_t b; Hoge c; Mugi d; uint8_t e; uint16_t f; } Setting; namespace { #pragma pack(push,1) template <typename T> struct TypeInt { static uint8_t dummy; }; template <typename T> uint8_t TypeInt<typename T>::dummy = 0; static const uint8_t* DUMMY = &TypeInt<void>::dummy; template <typename T> uint8_t getTypeInt(T* val) { return (uint8_t) ((&TypeInt<T>::dummy) - DUMMY) - 1; } static const int types[] = { getTypeInt(ref_member(Setting, a)), getTypeInt(ref_member(Setting, b)), getTypeInt(ref_member(Setting, c)), getTypeInt(ref_member(Setting, d)), getTypeInt(ref_member(Setting, e)), getTypeInt(ref_member(Setting, f)), }; } int main(int argc, char* argv[]) { for (int i=0; i<_countof(types); ++i) { printf("%d\n", types[i]); } return 0; }
テンプレートメタプログラミングといえば、GCCだとtypeofがあるみたいだしVC++2010だとdecltypeが使えるみたいなので少し羨ましい。