Как использовать decltype для получения типа векторного элемента в качестве аргумента шаблона - PullRequest
1 голос
/ 18 апреля 2019

Вот часть моего кода:

int getLength(const vector<int> &arr) {
    auto  n=arr.size(),dis=n;
    unordered_map<int,decltype(dis)> S;
    //...
}

Пока все хорошо. Теперь вместо жестко закодированного "int" для моего std::unordered_map я попытался изменить его на что-то вроде: unordered_map<decltype(arr.front()),decltype(dis)> S; или же unordered_map<decltype(arr)::value_type,decltype(dis)> S; или же unordered_map<decltype(arr[0]),decltype(dis)> S;

Никто, похоже, не работает. Какую грамматику можно использовать здесь decltype()? 1012 *

1 Ответ

2 голосов
/ 18 апреля 2019

Какая будет правильная грамматика для использования здесь decltype?

decltype(arr.front()) и decltype(arr[0]) все в порядке, но, к сожалению, все они возвращают ссылку *От 1008 * до const int (учитывая, что arr является постоянным вектором)

Вы должны удалить ссылку и константу, например,

std::unordered_map<
      std::remove_const_t<std::remove_reference_t<decltype(arr.front())>>,
      decltype(dis)> S;

Использование ::value_type лучше (ИМХО), потому что вы избегаете константности, поэтому вам нужно удалить только ссылку, чтобы вы могли написать

   std::unordered_map<
      std::remove_reference_t<decltype(arr)>::value_type,
      decltype(dis)> S;
...