Я использую std::type_index
объекты в качестве уникальных идентификаторов для классов состояний (в основном, ключи в фабричной функции для создания новых объектов ссылочного типа). Идентификатор класса, объекта этого класса и указатель на объект этого класса должны быть одинаковыми. Следовательно, я пытался сделать:
using stateid_t = std::type_index;
template<class T> inline stateid_t GetStateID() { return typeid(T); }
template<class T> inline stateid_t GetStateID(const T&) { return typeid(T); }
template<class T> inline stateid_t GetStateID(const T*) { return typeid(T); }
Однако третья версия никогда не вызывается с чем-то вроде GetStateID(this);
, всегда вторая версия, с типом T, выведенным как «указатель на T».
Я думаю Я должен быть в состоянии сделать это как-то, используя std::enable_if
, но я не могу придумать ничего, что работает.
Редактировать
Главное, что я хочу - это набор функций, удовлетворяющих
struct A{};
A a;
const A b;
//fixed asserts based on comments
assert(GetStateID<A>() == GetStateID(a));
assert(GetStateID(a) == GetStateID(&a));
assert(GetStateID(a) == GetStateID(b));
//added some new constraints
struct X : public A{};
X x;
assert(GetStateID<A>() != GetStateID<X>());
assert(GetStateID(a) != GetStateID(x));
Бонусные баллы за объяснение того, почему перегрузка указателя не выбирается.