Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2013, 12:09   #1
higimo
Новичок
Джуниор
 
Регистрация: 25.12.2013
Сообщений: 1
По умолчанию Убрать дублирование кода шаблонной функции

Здравствуйте, необходимо убрать дублирование кода

Код:
template <class T>
bool FindMax(std::vector<T> const& arr, T& maxValue) 
{
    if (arr.empty())
    {
        return false;
    }

    const T * largest = &arr[0];
    for (auto & item : arr)
    {
        if (item > *largest)
        {
            largest = &item;
        }
    }

    maxValue = *largest;
    return true;
}

template <> 
bool FindMax<const char *>(std::vector<const char*> const& arr, const char * & maxValue) 
{
    if (arr.empty())
    {
        return false;
    }

    const char * largest = arr[0];
    for (auto & item : arr)
    {
        if (strcmp(item, largest) > 0)
        {
            largest = item;
        }
    }

    maxValue = largest;
    return true;
}
Использовать std::max_element() запрещено; callback и прочие можно.

Заранее выражаю огромную благодарность нашедшему решение.
higimo вне форума Ответить с цитированием
Старый 25.12.2013, 12:27   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2higimo
тут 2 варианта: либо приводить все используемые в алгоритме типы к таким, у которых перегружен operator> (например, вместо const char* использовать std::string), либо вынести компаратор из алгоритма (и обобщить его на нужные типы):

Код:
#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

template <typename T>
struct Comparator {
	bool operator()(const T &a, const T &b) {
		return a > b;
	}
};

template <>
struct Comparator<const char *> {
	bool operator()(const char *a, const char *b) {
		return strcmp(a, b) > 0;
	}
};

template <class T>
bool FindMax(std::vector<T> const& arr, T& maxValue) 
{
	if (arr.empty())
	{
		return false;
	}

	const T * largest = &arr[0];
	for (auto & item : arr)
	{
		if (Comparator<T>()(item, *largest))
		{
			largest = &item;
		}
	}

	maxValue = *largest;
	return true;
}

int main()
{
	vector<int> v1 = {4,8,4,3,6,1,2,3,3};
	int m1;
	if (FindMax(v1, m1)) {
		cout << m1 << endl;
	}

	vector<const char *> v2 = { "hello", "world", "this", "is", "some", "str" };
	const char *m2;
	if (FindMax(v2, m2)) {
		cout << m2 << endl;
	}

	return 0;
}
пс. а благодаря итераторам, можно еще и обобщить контейнер
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Delphi 7] Проблема с кодом - убрать из кода работу с INI файлов -Jack- Помощь студентам 2 25.05.2012 21:21
Функции, сокращение кода Neolit1819 Помощь студентам 0 31.05.2011 08:48
Код,Функции,Удаление,Дублирование Kventl Помощь студентам 3 07.02.2011 21:03
Реализация шаблонной функции includes на C++ GanJIk Помощь студентам 0 26.12.2010 20:27
Как вphp коде убрать проверку кода отправки анонимного смс bestful PHP 1 01.07.2010 14:31