Я пытаюсь создать метод, который выбирает случайный элемент из типа контейнера, например std::vector
. Раньше я использовал это:Получение типа из параметров шаблона шаблона
std::string pick_random(std::vector<std::string> c) {
int r = std::rand() % ids.size() + 1;
auto it = c.begin();
std::advance(it, r);
return *it;
}
который, насколько я мог судить, работал нормально. Это не значит, что это отлично, только что это оказалось.
скоро я должен был сделать то же самое для другого контейнера, поэтому я попытался использовать аргументы шаблона шаблона, чтобы сделать метод родовой:
template <template<typename element_t> container_t>
element_t pick_random(container_t from) { /* ... */ }
Это, однако, выдает ошибку:
element_t does not name a type
Я думаю, что мое намерение достаточно ясное, но для его повторения: я пытаюсь получить тип элемента списка. У меня может быть отдельный параметр шаблона, но тогда он не может правильно вывести тип. Я пробовал разные версии, но никто не работает.
Любой шанс, я могу получить объяснение для newb?Я не говорю, что я один, но ... ладно, да. –
@QPaysTaxes То, что вы пытаетесь получить, - это получить контейнер, получить тип значения. Тип значения является результатом '* begin (container)' - поэтому это просто использует это напрямую, вместо того, чтобы пытаться «угадать» тип значения, разлагая тип контейнера. – Barry
О, я вижу! Спасибо: D –