Замечания по 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, которую можно было бы вызывать как с явным указанием операции сравнения, так и без указания оной. Во втором случае должна по умолчанию использоваться операция сравнения <