In C++11:
template <int kk, int vv>
struct kv
{
static const int k = kk, v = vv;
};
template <int dflt, typename...>
struct ct_map;
template <int dflt>
struct ct_map<dflt>
{
template<int>
struct get
{
static const int val = dflt;
};
};
template<int dflt, int k, int v, typename... rest>
struct ct_map<dflt, kv<k, v>, rest...>
{
template<int kk>
struct get
{
static const int val =
(kk == k) ?
v :
ct_map<dflt, rest...>::template get<kk>::val;
};
};
typedef ct_map<42, kv<10, 20>, kv<11, 21>, kv<23, 7>> mymap;
#include <iostream>
int main()
{
std::cout << mymap::get<10>::val << std::endl;
std::cout << mymap::get<11>::val << std::endl;
std::cout << mymap::get<23>::val << std::endl;
std::cout << mymap::get<33>::val << std::endl;
}