Я могу создать уникальный идентификатор типа следующим образом:
template<typename T>
struct TypeId
{
static size_t value()
{
return reinterpret_cast<size_t>(&TypeId<T>::value);
}
};
auto intType = TypeId<int>::value();
Он работает во время выполнения, но есть ли способ сделать это во время компиляции?Я хотел бы использовать его в выражении switch следующим образом:
switch (typeId)
{
case TypeId<int>::value():
// do something
break;
case TypeId<double>::value():
// do something
break;
case TypeId<MyClass>::value():
// do something
break;
}
Проблема здесь в том, что я не могу преобразовать указатель на size_t во время компиляции:
template<typename T>
struct TypeId
{
static constexpr size_t value()
{
return reinterpret_cast<size_t>(&TypeId<T>::value);
}
};
constexpr auto id = TypeId<int>::value();
Примервыше дает следующую ошибку:
error: conversion from pointer type ‘size_t (*)() {aka long unsigned int (*)()}’ to arithmetic type ‘size_t {aka long unsigned int}’ in a constant expression
constexpr auto id = TypeId<int>::value();
ОБНОВЛЕНИЕ
Я хотел бы понять, почему возвращение адреса хорошо в constexpr, но преобразование его в int не,Следующий код компилируется (но я не могу использовать указатели в операторе switch):
template<typename T>
struct TypeId
{
static constexpr void* value()
{
return reinterpret_cast<void*>(&TypeId<T>::value);
}
};
constexpr void* id = TypeId<int>::value();
std::cout << "id: " << id << std::endl;