Я хочу иметь возможность создавать операторы переключения по идентификатору типа. Я нашел механизм, который может дать уникальный идентификатор для разных типов. Это очень просто:
template <typename T>
struct type {
static void id() { }
};
template <typename T>
constexpr const size_t type_id() {
return reinterpret_cast<size_t>(&type<T>::id);
}
Я думал, что это будет оцениваться как константа, которую я мог бы использовать в качестве случаев для переключателя. Но я получаю сообщение об ошибке, что выражение case не является константой, когда я делаю следующее:
int main(void) {
size_t a = type_id<int>();
switch (a) {
case type_id<int>():
break;
}
return 0;
}
Почему не константа? Как я мог добиться такого эффекта?
Редактировать:
Могу ли я сделать что-то подобное без reinterpret_cast?