型のリストを作成し、コンパイル時にそのリスト内の型のインデックスを抽出できます。
私の別の答えから、これがこのテクニックです:
#include <type_traits>
template<typename... Types>
struct Seq {};
template<typename T, typename Seq, typename=void>
struct IndexOf;
template<typename T, typename First, typename... Types>
struct IndexOf<T, Seq<First, Types...>, typename std::enable_if< std::is_same<T, First>::value >::type > {
enum { value = 0 };
};
template<typename T, typename First, typename... Types>
struct IndexOf<T, Seq<First, Types...>, typename std::enable_if< !std::is_same<T, First>::value >::type > {
enum { value = 1+IndexOf<T,Seq<Types...>>::value };
};
typedef Seq< bool, char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long > IntegerTypes;
#include <iostream>
int main() {
std::cout << IndexOf< int, IntegerTypes >::value << "\n";
// this next line will not compile, because void is not in the IntegerTypes sequence:
// std::cout << IndexOf< void, IntegerTypes >::value << "\n";
}
私は整数でそれを使用しています。
したがって、整数が必要なタイプのリストがある場合は、すべてのタイプをリストするだけで、上記の手法でそれぞれに一意の整数が得られます (逆マッピングも比較的簡単です。リストへのコンパイル時のインデックスタイプ)。