Я думаю, что вы можете просто использовать статическую функцию для этого и наследовать ее класс:
struct IdCounter { static int counter; };
int IdCounter::counter;
template<typename Derived>
struct Id : IdCounter {
static int classId() {
static int id = counter++;
return id;
}
};
struct One : Id<One> { };
struct Two : Id<Two> { };
int main() { assert(One::classId() != Two::classId()); }
Конечно, это не будет статической константой времени компиляции - я не думаю, что это возможно автоматически (вам нужно было бы добавить эти типы вручную в некоторый список типов, например mpl::vector
). Обратите внимание, что для простого сравнения типов на равенство вам не нужно все это. Вам просто нужно использовать is_same
(находится в boost и других библиотеках и тривиально писать), что дает постоянную времени компиляции
template<typename A, typename B>
struct is_same { static bool const value = false; };
template<typename A>
struct is_same<A, A> { static bool const value = true; };
int main() { char not_true[!is_same<One, Two>::value ? 1 : -1]; }