Как я могу получить и использовать тип возвращаемого типа T :: ID () для использования в моих аргументах шаблона?
Должно быть сделано в C ++ 11.
У меня есть подпись шаблона:
template<typename EventType, typename IDType, std::unordered_map<IDType, uint64_t> ObjectRegistry::* MapRef >
uint64_t acquireHandleFromObject(EventType& id)
{
}
Это сопоставляет EventType члену unordered_map в классе ObjectRegistry и выполняет с ним некоторые операции.
Все объекты EventType могут не совпадать base, но будет иметь идентификатор метода, который возвращает класс T ID.
Я предполагаю, что должно быть возможно уменьшить аргументы шаблона и вывести эту информацию из EventType, используя следующее:
template<typename EventType, std::unordered_map<decltype(std::declval<EventType>().ID()), uint64_t> ObjectRegistry::* MapRef >
uint64_t acquireHandleFromObject(EventType& id)
{
}
Но это не работает.
В моем cpp, когда я пытаюсь специализировать новый шаблон подписи intellisense, сообщает, что специализация не возвращается с совпадением:
template uint64_t ObjectRegistry::acquireHandleFromObject<NAMESPACE::SomeEvent, &ObjectRegistry::m_someMap>(NAMESPACE::SomeEvent& event);
Редактировать:
Не важно, я идиот.
T :: ID () возвращает ссылку на класс ID. Мне нужно было использовать std :: decay :: type для decltype.