sergeythrees/Object-Oriented-Programming

Замечания по FindMaxEx

alexey-malov opened this issue · 0 comments

template<typename T, typename Less>
bool FindMaxEx(std::vector<T>const & arr, T & maxValue, Less const & less)
{
	if (arr.empty())
	{
		return false;
	}
	const T maxValueBackup = maxValue;
	try
	{
		const T* lastMax = &arr.front();
		for (size_t i = 0; i < arr.size(); ++i)
		{
			if (less(*lastMax, arr[i]))
			{
				lastMax = &arr[i];
			}
		}
		maxValue = *lastMax;
	}
	catch (const std::exception& ex)
	{
		maxValue = maxValueBackup;
		throw ex;
	}

	return true;
}
  • При присваивании указателей исключения не выбрасываются.

  • Строгую гарантию исключений обеспечить, предполагая, что оператор присваивания типа T обеспечивает строгую гарантию безопасности исключений, а операция сравнения обеспечивает либо гарантию отсутствия исключений, либо строгую гарантию безопасности, не изменяя сравниваемых значений даже при выбрасывании исключений.

  • Способ, которым вы бросаете пойманное исключений, приведет к тому, что вызывающий код поймает не оригинальный объект исключения, а его лишь часть, которую вы поймали. Для перевыброса исключения следует использоват несколько иной синтаксис оператор throw. В лекции все есть.

  • Нельзя полагаться на то, что операция, выбросившая в блоке try исключение, не выбросит его в блоке catch

  • Код может выбросить исключение, не являющееся наследником std::exception. В этом случае в ваш обработчик управление не будет передано

  • Задачу можно решить, не используя try/catch

  • Сделать одну версию функции FindMaxEx, которую можно было бы вызывать как с явным указанием операции сравнения, так и без указания оной. Во втором случае должна по умолчанию использоваться операция сравнения <