Другие языки программирования и технологии

Вопрос по С++. Подробности внутри.

Есть некая структура данных, пусть это будет массив data с элементами типа integer. (пусть будет выглядеть так "int data[5];") И есть функция, осуществляющая поиск по этой структуре, назовём её "int search("массив","тип", "значение");". Ну, найдя элемент равный закинутой переменной "значение", она возвращает номер этого элемента. >>>Вот главный вопрос, как закинуть в эту функцию значения "тип" и "значение", если мы заранее не знаем какой тип у массива. <<< Т.е. нужно указать нашей функции какого типа то, что мы ищем; и значение этого искомого нечта. Буду благодарен ответу. ps: Сори, если что, за корявую формулировку, просто речь идёт на самом деле о связном списке из структур и классе, который с ним работает.
Очевидно, что шаблоны подойдут здесь идеально.

template < typename T >
size_t search(const T arr[], size_t size, const T& value)
{
  for (size_t i = 0; i < size; i++)
    if (arr[ i ] == value)
      return i;
  return static_cast<size_t>( -1 ); // ну или return size, кому как больше нравится
}

А по-хорошему:
template < typename TIterator, typename TValue >
TIterator search(TIterator first, TIterator last, const TValue& value)
{
  for ( ;first != last; first++)
    if (*first == value)
      return first;
  return first;
}
А совсем по-хорошему - есть std::find, как раз по такой схеме и организован.

Перегрузка функций для каждого возможного набора аргументов есть ни что иное как маразм.
Роман Лоскутов
Роман Лоскутов
2 769
Лучший ответ
Чтобы функция воспринимала любой тип данных её нужно перегружать. То есть написать функцию с одинаковым именем и функциональностью, но в качестве параметров, каждый раз указывать разный тип данных (либо разное количество параметров, либо менять их местами. )

Например, вот прототипы 14 функций с одинаковым названием, и все они будут работать в одной программе, главное не запутаться в параметрах)) )

void func(int);
void func(double);
void func(int, int);
void func(double, int);
void func(int, double);
void func(double, double);
void func(int, int, int);
void func(double, int, int);
void func(int, double, int);
void func(int, int, double);
void func(double, double, int);
void func(double, int, double);
void func(int, double, double);
void func(double, double, double);
Ермек Кимбаев
Ермек Кимбаев
51 074