Как извлечь тип из пустого шаблонного контейнера, используя decltype? - PullRequest
0 голосов
/ 16 ноября 2018

Какой будет правильный синтаксис decltype для извлечения типа данных из определенного класса контейнера, не возвращаясь к value_type member typedef?

Я пытался получить прямой доступ к элементу с decltype<std::declval<myContainerClass>[0]>но я понимаю, что это не сработает, если контейнер пуст.

1 Ответ

0 голосов
/ 16 ноября 2018

Вы можете использовать

std::remove_reference_t<decltype(std::declval<Container>()[0])>

Все, что находится внутри decltype, не оценено, поэтому тот факт, что доступ к элементу 0 гипотетического пустого контейнера является UB, не имеет значения.Это просто извлекает необходимую информацию о типе из контейнера operator[].Вам нужен remove_reference, потому что operator[], вероятно, возвращает ссылку на lvalue.

Однако это не будет работать для контейнера, такого как std::list<T>.Вместо этого вы можете использовать:

typename std::iterator_traits<typename Container::iterator>::value_type

Если вы не можете предположить, что существует Container::iterator, вы можете заменить typename Container::iterator на decltype(std::declval<Container>().begin()).

...