Получение спецификатора типа для данного объекта - PullRequest
5 голосов
/ 26 июня 2011

Я пытаюсь написать шаблонную функцию, которая будет принимать контейнер STL и будет отображать все вхождения элементов в нем и число, в котором они произошли.Я планирую использовать карту, выполнить итерацию по контейнеру и либо добавить новый элемент, если он не существует, либо увеличить количество вхождений для этого элемента.

Объявление:

template < typename Container_t >
void findOccurrences (const Container_t& inContainer);

Мой вопрос: могу ли я как-то получить спецификатор типа элемента, который содержит контейнер?Поэтому, когда я создаю свою карту, ключевым значением будет элемент в inContainer.Что-то вроде:

map < typeid ( * inContainer.begin()), int > occurrences;

Или мне придется изменить свой шаблон на что-то вроде этого:

template < typename Container_t , typename Element_t >
void findOccurrences ( const Container_t & inContainer , Element_t dummy )
{
  map < Element_t , int > occurrences;
}

Спасибо

Ответы [ 4 ]

4 голосов
/ 26 июня 2011

Примерно так:

#include <map>
#include <iterator>

template <typename Iter>
void histogram(Iter begin, Iter end)
{
  typedef typename std::iterator_traits<Iter>::value_type T;

  std::map<T, size_t> h;

  while (begin != end) ++h[*begin++];

  // now h holds the count of each distinct element
}

Использование:

std::vector<std::string> v = get_strings();
histogram(v.begin(), v.end());
3 голосов
/ 26 июня 2011

Вы хотите typename Container_t::element_type

То есть

std::map <typename Container_t::element_type, int>
1 голос
/ 26 июня 2011

С C ++ 0x это действительно просто:

map<decltype(*c.begin()), int> occurrences;

В C ++ 03 вам, вероятно, нужно использовать typedef из контейнера:

template<typename Container>
// ...
map<Container::element_type, int> occurrences;
0 голосов
/ 26 июня 2011

Пожалуйста, посмотрите на "RTTI" (информация о типе времени выполнения)

http://en.wikipedia.org/wiki/Run-time_type_information

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...