В принципе, это возможно, хотя решение, вероятно, не то, что вы ищете.
Короче говоря, вам нужно предоставить явное сопоставление типов с целочисленными значениями, с одной записью для каждого возможного типа:
template< typename T >
struct type2int
{
// enum { result = 0 }; // do this if you want a fallback value
};
template<> struct type2int<AClass> { enum { result = 1 }; };
template<> struct type2int<BClass> { enum { result = 2 }; };
template<> struct type2int<CClass> { enum { result = 3 }; };
const int i = type2int<T>::result;
Если вы не предоставите реализацию отката в базовом шаблоне, это произойдет с ошибкой для неизвестных типов, если T
, в противном случае будет возвращено значение отката.
В зависимости от вашего контекста, могут быть и другие возможности. Например, вы можете определить эти числа внутри самих типов:
class AClass {
public:
enum { inta_val = 1 };
// ...
};
class BClass {
public:
enum { inta_val = 2 };
// ...
};
// ...
template< typename T >
struct type2int
{
enum { result = T::int_val }; // will fail for types without int_val
};
Если вы дадите больше контекста, могут быть и другие решения.
Редактировать :
На самом деле больше нет контекста. Я изучал, возможно ли это на самом деле, но без назначения самих номеров.
Я думаю, что идея Майка о порядке - хороший способ сделать это (опять же, для фиксированного набора типов ) без необходимости явно присваивать числа: они неявно задаются порядком. Тем не менее, я думаю, что это будет проще, используя список типов. Индекс любого типа в списке будет его номером. Я думаю, что может сделать что-то вроде следующего:
// basic type list manipulation stuff
template< typename T1, typename T2, typename T3...>
struct type_list;
// meta function, List is assumed to be some instance of type_list
template< typename T, class List >
struct index_of {
enum { result = /* find index of T in List */ };
};
// the list of types you support
typedef type_list<AClass, BClass, CClass> the_type_list;
// your meta function
template< typename T >
struct type2int
{
enum { result = index_of<T, the_type_list>::result };
};